//經典執行緒同步問題 互斥量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...