mutex與criticalsection相似,都為了處理多個執行緒對資源的訪問。區別是:mutex是核心物件,鎖住mutex需要花費更多的時間,mutex可以跨程序存在。沒有任何執行緒擁有mutex,這個mutex處於未激發狀態,執行緒通過呼叫waitfor***來獲得此mutex;除非這個執行緒releasemutex,否則其他執行緒都不能獲得這個mutex的擁有權。
mutex可以用來解決哲學家就餐問題:讓每個哲學家要麼獲得兩根筷子,要麼一跟筷子都不獲得。哲學家就餐問題中,筷子相當於mutex,每個哲學家要麼獲得兩個mutex,要麼乙個都不獲得。這樣就可以防止死鎖的發生。 1
/*2* mtveryfy.h <3*/
4#pragma comment( lib,
"user32")
56#include
<
crtdbg.h
>
7#define
mtassert(a) _asserte(a)89
10#define
mtverify(a) if (!(a)) printerror(#a,__file__,__line__,getlasterror())
1112
__inline
void
printerror(lpstr linedesc, lpstr filename,
intlineno, dword errnum)13
1#include
<
stdio.h
>
2#include
<
stdlib.h
>
3#include
<
windows.h
>
4#include
"mtverify.h"5
6#define
num_phil 578
handle gchopsticks[num_phil]
=;
//mutex控制代碼,用來表示
筷子,即哲學家們爭取的資源
9static
intflag =1
;1011dword winapi threadfunc(lpvoid);
//執行緒函式,每個執行緒代表乙個哲學家,哲學家們來爭奪筷子(即mutex)資源
1213
intmain()
1423
24sleep(
20000
); //
主線程睡眠20000ms,這段時間內,所有哲學家想吃飯的時候,爭奪筷子資源
25flag =0
; //
標誌置為0,讓所有執行緒都正常退出
2627
mtverify( wait_object_0
==waitformultipleobjects(num_phil, hphil, true, infinite) );
28for(i=
0; i
<
num_phil; i++)
2933
34system(
"pause");
35return0;
36}3738
dword winapi threadfunc(lpvoid n)
3957
58return
(dword)n;59}
WIN32多執行緒
win32多執行緒學習 1.執行緒建立 handle createthread lpsecurity attributes lpthreadattributes,dword dwstacksize,lpthread start routine lpstartaddress,lpvoid lppara...
多執行緒的同步機制
1 event 用事件 event 來同步執行緒是最具彈性的了。乙個事件有兩種狀態 激發狀態和未激發狀態。也稱有訊號狀態和無訊號狀態。事件又分兩種型別 手動重置事件和自動重置事件。手動重置事件被設定為激發狀態後,會喚醒所有等待的執行緒,而且一直保持為激發狀態,直到程式重新把它設定為未激發狀態。自動重...
Win32建立多執行緒
win32建立多執行緒,貼下 define win32 lean and mean include include include include include include include include include define max threads 3 dword winapi pr...