執行緒同步(windows平臺):訊號量

蝸牛201發表於2018-10-26

一:介紹

訊號量也是系統核心物件,它允許多個執行緒同一時刻訪問同一資源,但需限制同一時刻訪問資源的最大執行緒數目。

訊號量遵循規則:
1.當前資源計數大於0,訊號量有效。
2.當前資源計數等於0,訊號量無效。
3.系統不允許當前資源數量為負。
4.當前資源數量不能大於最大資源數量。

二:函式說明

建立訊號量:
    HANDLE   CreateSemaphore( 
        LPSECURITY ATTRIBUTES   lpSemaphoreAttributes,     //安全屬性 
        LONG   lInitialCount,                                     //訊號量物件的初始值該值必須大於等於0,小於等於lMaximumCount。大於0時,訊號量被喚醒。 當釋放了一個等待該訊號量的執行緒時,lInitialCount值減1,當呼叫函式ReleaseSemaphore()時,按其指定的數量加一個值。
        LONG   lMaximumCount,                             //訊號量的最大值,必須大於0
        LPCTSTR   lpName                                       //訊號量名 
    )
    
獲得訊號量物件:
    DWORD WaitForSingleObject( 
            HANDLE hHandle,        //事件物件的控制程式碼 
            DWORD dwMilliseconds    //0:測試物件的狀態立即返回;INFINITE:物件被觸發訊號後,函式才會返回
    )

釋放訊號量:
    BOOL  ReleaseSemaphore(
        HANDLE  hSemaphore,            //訊號量控制程式碼
        LONG      lReleaseCount,         //增加個數,大於0,小於訊號量最大值
        LPLONG  lpPreviousCount     //可以用來傳出先前的資源計數,設為NULL表示不需要傳出
    )

三:程式碼實現

 1 /********************************************************
 2 Copyright (C),  2016-2018,
 3 FileName:        t13
 4 Author:            woniu201
 5 Email:             wangpengfei.201@163.com
 6 Created:           2018/10/24
 7 Description:    執行緒同步-訊號量
 8 ********************************************************/
 9 #include <iostream>
10 #include <Windows.h>
11  
12 using namespace std;
13  
14 volatile int number = 1;
15 HANDLE hSemaphore;
16  
17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
18 {
19     while (1)
20     {
21         WaitForSingleObject(hSemaphore, INFINITE);    //等待訊號量
22         cout << "Thread1:" << number++ << endl;
23         ReleaseSemaphore(hSemaphore, 1, NULL);        //訊號量的當前資源+1
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(hSemaphore, INFINITE);   //等待訊號量
38         cout << "Thread2:" << number++ << endl;
39         ReleaseSemaphore(hSemaphore, 1, NULL);        //訊號量的當前資源+1
40         if (number >= 1000)
41         {
42             break;
43         }
44     }
45     return 0;
46 }
47  
48  
49 int main()
50 {
51     //建立自動事件
52     hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);
53  
54     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
55     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
56  
57     getchar();
58     return 1;
59 }

 

掃碼關注公眾號

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

相關文章