线程同步(windows平台):信号量

信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目。

信号量遵循规则:
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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/********************************************************
Copyright (C), 2016-2018,
FileName: t13
Author: woniu201
Created: 2018/10/24
Description: 线程同步-信号量
********************************************************/
#include <iostream>
#include <Windows.h>

using namespace std;

volatile int number = 1;
HANDLE hSemaphore;

DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while (1)
{
WaitForSingleObject(hSemaphore, INFINITE); //等待信号量
cout << "Thread1:" << number++ << endl;
ReleaseSemaphore(hSemaphore, 1, NULL); //信号量的当前资源+1
if (number >= 1000)
{
break;
}

}
return 0;
}

DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while (1)
{
WaitForSingleObject(hSemaphore, INFINITE); //等待信号量
cout << "Thread2:" << number++ << endl;
ReleaseSemaphore(hSemaphore, 1, NULL); //信号量的当前资源+1
if (number >= 1000)
{
break;
}
}
return 0;
}


int main()
{
//创建自动事件
hSemaphore = CreateSemaphore(NULL, 1, 1, NULL);

CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);

getchar();
return 1;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×