一:介紹
訊號量也是系統核心物件,它允許多個執行緒同一時刻訪問同一資源,但需限制同一時刻訪問資源的最大執行緒數目。
訊號量遵循規則:
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程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。