使用Win32 API實現生產者消費者執行緒同步

2021-07-03 21:52:54 字數 2586 閱讀 2927

使用win32 api建立執行緒,建立訊號量用於執行緒的同步

建立訊號量

語法如下

handle semophore;

semophore = createsemaphore(lpsemaphoreattributes, linitialcount, lmaximumcount, lpname);

createsemophore函式的原型如下:

handle winapi createsemaphore(

_in_opt_ lpsecurity_attributes lpsemaphoreattributes,//屬性

_in_ long linitialcount,//初始值

_in_ long lmaximumcount,//最大值

_in_opt_ lpctstr lpname//訊號量物件的名字

);

函式返回乙個指向訊號量物件的控制代碼,是乙個handle物件

wait操作和signal操作

使用結構一般是這樣的

while(true)

兩個函式的原型如下:

dword waitforsingleobject(

handle hhandle,//控制代碼,可以指向訊號量或者執行緒

dword dwmilliseconds//等待的毫秒數

);bool releasesemaphore(

handle hsemaphore,//控制代碼,指向訊號量

long lreleasecount,//給訊號量增加值,一般是1

lplong lppreviouscount//儲存訊號量之前的值的變數的指標

);

建立執行緒

handle producer;

//producer 執行緒執行這個函式

//pro_id 執行緒id

producer = createthread(null, 0, producer, null, 0, &pro_id);//建立執行緒

函式原型

handle winapi createthread(

_in_opt_ lpsecurity_attributes lpthreadattributes,//指向執行緒屬性結構體的指標

_in_ size_t dwstacksize,//棧的初始化大小,0表示使用預設的大小

_in_ lpthread_start_routine lpstartaddress,//起始位址,也就是執行緒函式的指標

_in_opt_ lpvoid lpparameter,//執行緒函式引數的指標

_in_ dword dwcreationflags,//控制建立的標誌位,0表示執行緒建立後立即執行,create_suspended表示新建為suspended狀態,直到 resumethread 被呼叫時才執行,stack_size_param_is_a_reservation,由dwstacksize 引數指定初始的保留棧的大小,不指定的話,dwstacksize指定提交的大小

_out_opt_ lpdword lpthreadid//執行緒id的指標

);

生產者消費者執行緒同步**如下

#include#include#define queue_length 10 //緩衝區長度

handle full_sem; //滿訊號量

handle empty_sem; //空訊號量

struct msg

;//訊息結構

msg msgqueue[queue_length]; //緩衝區

int head = 0;//佇列頭

int tail = 0;//佇列尾

dword winapi consumer(lpvoid lpparameter){//消費者執行緒

for (int i = 0;;i++){

waitforsingleobject(full_sem, infinite);//wait操作

//waitforsingleobject(mutex, infinite);//多個消費者需要加互斥訊號量

int val = msgqueue[head].i;

head = (head + 1) % queue_length;

//releasesemaphore(mutex, 1, null);//signal操作

std::cout << "consumer : "<

win32彙編使用win32 api實現字串拷貝

字串拷貝,呼叫win32的lstrcpy函式 拷貝了以後用訊息框顯示一下 386 model flat,stdcall option casemap none include s masm32 include windows.inc include s masm32 include user32.i...

用Win32 API實現序列通訊

2003 7 9 7 56 18 pcvc.wangxi 閱讀次數 30453 串列埠是常用的計算機與外部序列裝置之間的資料傳輸通道,由於序列通訊方便 易行,所以應用廣泛。我們可以利用windows api 提供的通訊函式編寫出高可移植性的 序列通訊程式。在win16中,可以利用open m clo...

win32API實現透明字幕視窗

hwnd hwnd createwindowex ws ex layered,text testwindow text 透明視窗 ws popup ws visible,0,0,20,20,null,hinstance,null setlayeredwindowattributes hwnd,0,0...