Windows多线程同步系列之四-----信号量

信号量说实话自己没怎么使用过。书上大概这样说,信号量设置一个资源访问计数。当该计数值大于0的时候,该信号量对象

为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态。

 

我们来查几个主要的API用于前面的卖票问题,信号量

同步中主要函数包括以下几个:

 

该函数用于创建一个信号量句柄,返回值即为该信号量句柄。

第一个参数为安全属性,默认安全属性为NULL

第二个参数为初始计数值,我们这里设为1,使其初始为有信号状态。

第三个参数为最大计数值,这里我们同样设为1,因为两个线程在某一时刻只能

有一个线程卖票。

第四个为信号量对象名称,我们设NULL,未命名的信号量对象。

 

 

这个函数用于增加信号量对象计数值,如果执行成功则返回非零,执行失败则返回零值。

参数1为信号量对象

参数2为信号量计数增加值。也就是说当一个窗口售票结束后,增加资源计数,让另外的窗口获取卖票权

 

 

当然这里还是会使用到等待函数WaitforSingleObject,该函数将等待信号量对象的计数值大于0的时候将该信号量对象

的计数值减去1,我们在卖票完了之后将调用ReleaseSemaphore()增加计数值值为1,这时候另外的窗口线程便可以拥有

卖票的权限。

 

 

卖票程序的信号量同步实现如下:

 1 #include <windows.h>
 2 #include <stdio.h>
 3 
 4 static int number=10;
 5 HANDLE Sem;
 6 
 7 DWORD WINAPI ThreadOne(LPVOID lpParameter)
 8 {
 9     printf("窗口1售票开始:\n");
10     while(1)
11     {
12         WaitForSingleObject(Sem,INFINITE);
13         if(number>0)
14         {
15             printf("窗口1售出第%d张票...\n",number);
16             number--;
17             Sleep(1000);        
18         }
19         ReleaseSemaphore(Sem,1,NULL);
20         Sleep(100);
21     }
22     return 0;
23 }
24 DWORD WINAPI ThreadTwo(LPVOID lpParameter)
25 {
26     printf("窗口2售票开始:\n");
27     while(1)
28     {
29         WaitForSingleObject(Sem,INFINITE);
30         if(number>0)
31         {
32             printf("窗口2售出第%d张票...\n",number);
33             Sleep(1000);
34             number--;
35         }
36         ReleaseSemaphore(Sem,1,NULL);
37         Sleep(100);
38     }
39     return 0;
40 }
41 
42 
43 int main()
44 {
45     HANDLE HOne,HTwo;
46     
47     printf("***********************vpoet******************\n");
48     HOne=CreateThread(NULL,0,ThreadOne,NULL,0,NULL);
49     HTwo=CreateThread(NULL,0,ThreadTwo,NULL,0,NULL);
50     Sem=CreateSemaphore(NULL,1,1,NULL);
51     CloseHandle(HOne);
52     CloseHandle(HTwo);
53     while(TRUE)
54     {
55         if(number==0)
56         {
57             printf("不好意思,票卖完了!\n");
58             CloseHandle(Sem);
59             return 0;
60         }
61         else
62         {
63             continue;
64         }    
65     }
66     
67     return 0;
68 }

 

运行截图:

 

转载于:https://www.cnblogs.com/vpoet/p/4686258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值