多執行緒同步Mutex

2021-07-23 22:53:57 字數 2522 閱讀 4183

//經典執行緒同步問題 互斥量mutex  

#include #include #include long g_nnum;

unsigned int __stdcall fun(void *ppm);

unsigned int __stdcall fun1(void *ppm);

unsigned int __stdcall fun2(void *ppm);

const int thread_num = 10;

//互斥量與關鍵段

handle g_hthreadparameter;

handle g_hthreadparameter2;

critical_section g_csthreadcode;

//1.互斥量是核心物件,它與關鍵段都有「執行緒所有權」所以不能用於執行緒的同步。

//// 2.互斥量能夠用於多個程序之間執行緒互斥問題,並且能完美的解決某程序意外終止所造成的「遺棄」問題。

int main()

waitformultipleobjects(thread_num, handle, true, infinite);

//銷毀互斥量和關鍵段

closehandle(g_hthreadparameter);

sleep(30000);

deletecriticalsection(&g_csthreadcode);

for (i = 0; i < thread_num; i++)

closehandle(handle[i]);

return 0;

} unsigned int __stdcall fun1(void *ppm)

printf("執行緒fun1\n");

releasemutex(g_hthreadparameter2);

return 0;

}unsigned int __stdcall fun2(void *ppm)

printf("執行緒fun2*********\n");

while(1)

sleep(20);//加了這個的作用是為了讓程式不退出,目的是驗證fun1 與fun2 是互斥的。

//當把這個while迴圈注釋掉 則會輸出fun1的列印 說明了//g_hthreadparameter2  被fun2佔據。其他執行緒不能獲得控制權。
return 0;}unsigned int __stdcall fun(void *ppm)

#include #include #include #include using namespace std;

long g_nnum_semaphore;

unsigned int __stdcall fun_semaphore(void *ppm);

const int thread_num = 60;

//訊號量與關鍵段

handle g_hthreadparameter_semaphore;

critical_section g_csthreadcode_semaphore;

int g_iexcmaxnum=3;

int main()

waitformultipleobjects(thread_num, handle, true, infinite);

sleep(30000);

int endchar;

cin>>endchar;

//銷毀訊號量和關鍵段

deletecriticalsection(&g_csthreadcode_semaphore);

closehandle(g_hthreadparameter_semaphore);

for (i = 0; i < thread_num; i++)

closehandle(handle[i]);

return 0;

} unsigned int __stdcall fun_semaphore(void *ppm)

總結mutex和semaphore內部都是有乙個計數器。這個計數器,在使用waitforsingleobject 等等待函式的時候,去和這個計數比較,對於mutex來說,如果》0 這個核心物件已經被觸發了。別的執行緒wait函式就必須等待這個核心物件被釋放,>0 wait 函式會阻塞,等於0 不會阻塞。如果計數等於0 。則說明這個核心物件沒有被觸發,處於空閒狀態,可以去觸發。對於mutex來說wait函式是對計數器加一的作用,realsemutex 是減一,並且減到0 ,不會往下減。對於semaphore來說waitforsingleobject 會對計數器起到減一的作用,realsesemaphore有對計數器加一的作用。.>0,wait 函式不會阻塞,wait函式使計數減一,直到0.wai函式會阻塞。要讓其不阻塞就必須是計數增加。

用mutex同步多執行緒

include include dword winapi threadproc1 lpvoid lpparameter dword winapi threadproc2 lpvoid lpparameter int index 0 int tickets 100 handle hmutex int ...

多執行緒 同步 Mutex互斥量

建立互斥量 handle createmutex lpsecurity attributes lpmutexattributes,安全性 bool binitialowner,true 建立執行緒擁有互斥量,false 相反 lpctstr lpname 執行緒名字,如果為null表示匿名,否則為命...

C 多執行緒同步 二 Mutex

monitor和lock多用於鎖定被呼叫端,而mutex則多用鎖定呼叫端。lock this 或者是用monitor也是一樣的,如下 monitor.enter this do something monitor.exit this monitor的好處是可以用tryenter this,timeo...