多生產者多消費者問題C C 實現

2021-10-23 12:12:44 字數 3376 閱讀 8631

/*

這裡使用到幾個常用函式:

#include//訊號量

handle winapi createsemaphore(

_in_opt_ lpsecurity_attributes lpsemaphoreattributes //安全屬性,如果為null則是預設安全屬性

_in_ long linitialcount,//訊號量的初始值,要》=0且<=第三個引數

_in_ long lmaximumcount,//訊號量的最大值

_in_opt_ lpctstr lpname //訊號量的名稱

);return : 指向訊號量的控制代碼,如果建立的訊號量和已有的訊號量重名,那麼返回已經存在的訊號量控制代碼

//p操作

dword waitforsingleobject(

handle hhandle, //等待物件的 handle(代表乙個核心物件)。

dword dwmilliseconds //等待的最長時間。時間終了,即使 handle尚未成為激發狀態,此函式也要返回。此值可以是0(代表立刻返回),也可以是 infinite代表無窮等待。

);//v操作

bool winapi releasesemaphore(

_in_ handle hsemaphore, //訊號量控制代碼

_in_ long lreleasecount, //釋放後,訊號量增加的數目

_out_opt_ lplong lppreviouscount //訊號量增加前的值存放的位址,如果不需要則為null

);return 釋放是否成功

_beginthreadex()

c語言庫 #include中的函式, 用來建立乙個執行緒

unsigned long _beginthreadex(

void *security, // 安全屬性, 為null時表示預設安全性

unsigned stack_size, // 執行緒的堆疊大小, 一般預設為0

unsigned(_stdcall *start_address)(void *), // 所要啟動的執行緒函式

void *argilist, // 執行緒函式的引數, 是乙個void*型別, 傳遞多個引數時用結構體

unsigned initflag, // 新執行緒的初始狀態,0表示立即執行,create_suspended表示建立之後掛起

unsigned *threaddr // 用來接收執行緒id

);return // 成功返回新執行緒控制代碼, 失敗返回0

*/

#include

#include

#include

#include

using

namespace std;

//handle 設定控制代碼

//handle mutex;//互斥訊號量

//思考後你會發現,如果盤子容量為1;這個不需要互斥量也能實現程序互斥,該阻塞的時候還是阻塞;

//同步訊號量 蘋果 橘子 盤子

int buf_max;

//緩衝池大小 盤子可以放幾個水果

0, product_orange =0;

//產品數量

//爸爸放蘋果執行緒

(void*)

return1;

}//媽媽放橘子執行緒

unsigned __stdcall momtoorange

(void*)

return1;

}//女兒吃蘋果執行緒

(void*)

return2;

}//兒子吃橘子執行緒

unsigned __stdcall soneatorange

(void*)

return2;

}int

main()

//建立訊號量

plate =

createsemaphore

(null

, buf_max, buf_max,

null);

//初值化盤子容量

createsemaphore

(null,0

, buf_max,

null);

//初值為0,最大為盤子容量

orange =

createsemaphore

(null,0

, buf_max,

null);

//初值為0,最大為盤子容量

//mutex = createsemaphore(null, 1, 1, null); //初值為1,最大為1

handle hth1, hth2, hth3, hth4;

//執行緒控制代碼

//建立執行緒

hth1 =

(handle)

_beginthreadex

(null,0

null,0

,null);

hth2 =

(handle)

_beginthreadex

(null,0

, momtoorange,

null,0

,null);

hth3 =

(handle)

_beginthreadex

(null,0

, soneatorange,

null,0

,null);

hth4 =

(handle)

_beginthreadex

(null,0

null,0

,null);

//等待子執行緒結束

waitforsingleobject

(hth1, infinite)

;waitforsingleobject

(hth2, infinite)

;waitforsingleobject

(hth3, infinite)

;waitforsingleobject

(hth4, infinite)

;//關閉控制代碼

closehandle

(hth1)

;closehandle

(hth2)

;closehandle

(hth3)

;closehandle

(hth4)

;closehandle

(plate)

;closehandle

;closehandle

(orange)

;//closehandle(mutex);

}

python queue 多生產者,多消費者

專案需求是從快 爬取ip,運用到專案中,設定佇列的大小,當有ip被消耗時,就新增新的ip到佇列中,獲取ip的頁面是不斷重新整理的。總的來說,就是一方不斷把爬取ip存到佇列中,一方不斷從佇列中取ip,消耗ip,此處爬取的是快 首先建立乙個佇列 from queue import queue q que...

生產消費模型 多生產者vs多消費者

使用場景 遊戲中多個玩家生產任務,伺服器多執行緒處理任務,netty工作執行緒收到客戶端傳來資料,生成任務後,加入到任務佇列中 public abstract class basetask 任務管理器 public class mutitaskmanager private final static...

單生產者 多消費者模型

問題出處 生產者消費者問題 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步方式執行的,但它們必須保持同步,即不...