1. 程式人生 > >線程同步(windows平臺):信號量

線程同步(windows平臺):信號量

屬性 right 同步 tchar fun infinite author gpe 無效

一:介紹

信號量也是系統核心對象,它允許多個線程同一時刻訪問同一資源,但需限制同一時刻訪問資源的最大線程數目。

信號量遵循規則:
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:             [email protected]
 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 }

線程同步(windows平臺):信號量