Windows多线程同步系列之四-----信号量
信号量说实话自己没怎么使用过。书上大概这样说,信号量设置一个资源访问计数。当该计数值大于0的时候,该信号量对象
为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态。
我们来查几个主要的API用于前面的卖票问题,信号量
同步中主要函数包括以下几个:

该函数用于创建一个信号量句柄,返回值即为该信号量句柄。
第一个参数为安全属性,默认安全属性为NULL
第二个参数为初始计数值,我们这里设为1,使其初始为有信号状态。
第三个参数为最大计数值,这里我们同样设为1,因为两个线程在某一时刻只能
有一个线程卖票。
第四个为信号量对象名称,我们设NULL,未命名的信号量对象。

这个函数用于增加信号量对象计数值,如果执行成功则返回非零,执行失败则返回零值。
参数1为信号量对象
参数2为信号量计数增加值。也就是说当一个窗口售票结束后,增加资源计数,让另外的窗口获取卖票权
当然这里还是会使用到等待函数WaitforSingleObject,该函数将等待信号量对象的计数值大于0的时候将该信号量对象
的计数值减去1,我们在卖票完了之后将调用ReleaseSemaphore()增加计数值值为1,这时候另外的窗口线程便可以拥有
卖票的权限。
卖票程序的信号量同步实现如下:
#include <windows.h>
#include <stdio.h> static int number=;
HANDLE Sem; DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
printf("窗口1售票开始:\n");
while()
{
WaitForSingleObject(Sem,INFINITE);
if(number>)
{
printf("窗口1售出第%d张票...\n",number);
number--;
Sleep();
}
ReleaseSemaphore(Sem,,NULL);
Sleep();
}
return ;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
printf("窗口2售票开始:\n");
while()
{
WaitForSingleObject(Sem,INFINITE);
if(number>)
{
printf("窗口2售出第%d张票...\n",number);
Sleep();
number--;
}
ReleaseSemaphore(Sem,,NULL);
Sleep();
}
return ;
} int main()
{
HANDLE HOne,HTwo; printf("***********************vpoet******************\n");
HOne=CreateThread(NULL,,ThreadOne,NULL,,NULL);
HTwo=CreateThread(NULL,,ThreadTwo,NULL,,NULL);
Sem=CreateSemaphore(NULL,,,NULL);
CloseHandle(HOne);
CloseHandle(HTwo);
while(TRUE)
{
if(number==)
{
printf("不好意思,票卖完了!\n");
CloseHandle(Sem);
return ;
}
else
{
continue;
}
} return ;
}
运行截图:

Windows多线程同步系列之四-----信号量的更多相关文章
- Windows多线程同步系列之二-----关键区
关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权. 关键区同步主要有以下几个API 初始化关键区对象,无返回值,传入一个关键区 ...
- Windows多线程同步系列之一-----互斥对象
多线程同步之互斥对象 作者:vpoet mail:vpoet_sir@163.com 对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步. 首先看看windows API ...
- Windows多线程同步系列之三-----事件对象
事件是一个内核事件,内核事件是什么呢,我理解也不深入也不好说,暂且理解为一个内核维护的数据类型吧通过内核事件同步主要 的方法是对事件的信号有和无来进行同步. 比如当我们一个线程进入一段临界代码(独占代 ...
- 总结windows多线程同步互斥
windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...
- windows多线程同步互斥--总结
我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...
- windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率 ...
- windows多线程同步
概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同 ...
- windows多线程同步总结
1.多线程同步与多线程互斥的关系 其实这也是我一直困扰的问题,在这里我只是说说我的理解.我的理解是多线程互斥是针对于多线程资源而言的. 而多线程同步是针对于多线程时序问题.由于线程的并发性导致其运行时 ...
- windows多线程同步--信号量
推荐参考博客:秒杀多线程第八篇 经典线程同步 信号量Semaphore 首先先介绍和windows信号量有关的两个API:创建信号量.释放信号量 HANDLE WINAPI CreateSem ...
随机推荐
- unix c 08
信号 - signal()改变信号的处理方式.默认情况下,信号在Unix中都有自己的处理方式,如果想改变信号的处理方式,signal/sigaction 可以实现. 信号可以在关键代码处进行屏蔽,因为 ...
- .net 分页案例效果
; ) { pageUrl += ) + && (totalPageCount > step ...
- 精确覆盖DLX算法模板另一种写法
代码 struct DLX { int n,id; int L[maxn],R[maxn],U[maxn],D[maxn]; ]; int H[ms]; ) //传列长 { n=nn; ;i<= ...
- Java宝典(三)
--说说ArrayList,Vector,LinkedList的存储性能和特性. --ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,他们都 ...
- sae-v2ex 一个运行在SAE上的类似v2ex的轻型python论坛 - 技术讨论 - 云计算开发者社区 - Powered by Discuz!
sae-v2ex 一个运行在SAE上的类似v2ex的轻型python论坛 - 技术讨论 - 云计算开发者社区 - Powered by Discuz! sae-v2ex 一个运行在SAE上的类似v2e ...
- Handsontable通用方法
1.clear():清空数据 2.createCol(index,amount,createAutomatically):添加列 index:列索引,amount:添加的列总数,crea ...
- SPRING源码分析:IOC容器
在Spring中,最基本的IOC容器接口是BeanFactory - 这个接口为具体的IOC容器的实现作了最基本的功能规定 - 不管怎么着,作为IOC容器,这些接口你必须要满足应用程序的最基本要求: ...
- MapReduce源代码浅析
Thanks @读程序的手艺人 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvemhhbmZlbmc=/font/5a6L5L2T/fontsize ...
- 前端编辑神器Brackets
介绍 Brackets 是Adobe发布的一款免费.开源且跨平台的 HTML/CSS/JavaScript 前端 WEB 集成开发环境.使用Node.js构建!官网:http://brackets.i ...
- sql语句中查询出的数据添加一列,并且添加默认值
查询出数据,并且要添加一列表中都不存在的数据,且这一列的值都是相等的 select app_id,app_secret from wx_ticket group by app_id; 查询出的数据是 ...