欢迎光临散文网 会员登陆 & 注册

秒杀多线程-

2023-03-20 20:37 作者:ベ计院小白隆ミ  | 我要投稿

推荐阅读:

信号量Semaphore常用有三个函数


函数的原型和使用说明

CreateSemaphore()

函数功能:创建信号量

函数原型:

函数说明:第一个参数表示安全控制,一般直接传入NULL第二个参数表示初始资源数量。第三个参数表示最大并发数量。第四个参数表示信号量的名称,传入NULL表示匿名信号量。


OpenSemaphore()

函数功能:打开信号量

函数原型:

函数说明:第一个参数表示访问权限,对一般传入SEMAPHORE_ALL_ACCESS第二个参数表示信号量句柄继承性,一般传入TRUE即可。第三个参数表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量。


ReleaseSemaphore()

函数功能:递增信号量的当前资源计数(将指定信号量对象的计数增加指定的量)

函数原型:

函数说明:第一个参数是信号量的句柄。第二个参数表示增加个数,必须大于0且不超过最大资源数量。(要增加信号量对象的当前计数的量。该值必须大于零。如果指定的数量会导致信号灯的计数超过创建信号量时指定的最大计数,则计数不会更改,函数将返回 FALSE。)第三个参数可以用来传出先前的资源计数,设为NULL表示不需要传出。

注意:当前资源数量大于0,表示信号量处于触发,等于0表示资源已经耗尽故信号量处于末触发。在对信号量调用等待函数时,等待函数会检查信号量的当前资源计数,如果大于0(即信号量处于触发状态),减1后返回让调用线程继续执行。一个线程可以多次调用等待函数来减小信号量。


最后一个 信号量的清理与销毁由于信号量是内核对象,因此使用CloseHandle()就可以完成清理与销毁了。


代码

在经典多线程问题中设置一个信号量和一个关键段。用信号量处理主线程与子线程的同步,用关键段来处理各子线程间的互斥。详见代码:


可以看出来,信号量也可以解决线程之间的同步问题。

由于信号量可以计算资源当前剩余量并根据当前剩余量与零比较来决定信号量是处于触发状态或是未触发状态,因此信号量的应用范围相当广泛。


参考:https://blog.csdn.net/morewindows/article/details/7481609


秒杀多线程-的评论 (共 条)

分享到微博请遵守国家法律