執行緒同步(windows平臺):互斥物件

蝸牛201發表於2018-10-23

一:介紹

互斥物件是系統核心維護的一種資料結構,保證了物件對單個執行緒的訪問權。

二:函式說明

建立互斥物件:
    HANDLE CreateMutex(
            LPSECURITY_ATTRIBUTES lpMutexAttributes, 安全屬性結構指標,可為NULL,表示預設安全性
            BOOL bInitialOwner,     //是否佔有該互斥量,TRUE:佔有,FALSE:不佔有
            LPCTSTR lpName         //設定互斥物件的名字
    );
獲得互斥物件:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //互斥物件的控制程式碼 
            DWORD dwMilliseconds    //0:測試物件的狀態立即返回;INFINITE:物件被觸發訊號後,函式才會返回
}
釋放互斥物件:
    BOOL ReleaseMutex(HANDLE hHandle)

三:步驟

  1. 宣告互斥物件:HANDLE hMutex
  2. 建立互斥物件:hMutex = CreateMutex(NULL, FALSE, NULL)
  3. 使用互斥物件:WaitForSingleObject(hMutex, INFINITE)
  4. 釋放互斥物件:ReleaseMutex(hMutex)

四:程式碼實現

 1 /********************************************************
 2 Copyright (C),  2016-2018,
 3 FileName:        t13
 4 Author:            woniu201
 5 Email:             wangpengfei.201@163.com
 6 Created:           2018/10/23
 7 Description:    執行緒同步-互斥物件
 8 ********************************************************/
 9 #include <iostream>
10 #include <Windows.h>
11 
12 using namespace std;
13 
14 volatile int number = 1;
15 HANDLE hMutex;
16 
17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
18 {
19     while (1)
20     {
21         WaitForSingleObject(hMutex, INFINITE);
22         cout << "Thread1:" << number++ << endl;
23         ReleaseMutex(hMutex);
24         if (number >= 1000)
25         {
26             break;
27         }
28         
29     }
30     return 0;
31 }
32 
33 DWORD CALLBACK ThreadFun2(LPVOID pParam)
34 {
35     while (1)
36     {
37         WaitForSingleObject(hMutex, INFINITE);
38         cout << "Thread2:" << number++ << endl;
39         ReleaseMutex(hMutex);
40         if (number >= 1000)
41         {
42             break;
43         }
44     }
45     return 0;
46 }
47 
48 
49 int main()
50 {
51     hMutex = CreateMutex(NULL, FALSE, NULL); 
52 
53     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
54     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
55 
56     getchar();
57     return 1;
58 }

 

掃碼關注公眾號

專注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分散式,高併發,設計模式,爬蟲,docker,shell程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。

相關文章