一:介绍
信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目。
信号量遵循规则:
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 }
原文地址:https://www.cnblogs.com/woniu201/p/9855402.html