WIN32多執行緒四 執行緒同步機制Mutex

2021-09-13 20:28:41 字數 1677 閱讀 2015

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...