如何锁定具有多个计数的信号量

时间:2019-05-27 13:04:40

标签: windows synchronization semaphore waitforsingleobject

信号量是一个计数对象。问题是如何用多个计数锁定它?

例如,我想调用lock(num, timeout)函数。当至少有num个可用资源时,它会锁定;或者,当timeout通过时,它将失败,但仍有资源少于num

在Windows上可以吗?或者也许使用pthread?

当前在Windows上,WaitForSingleObject将对象数量减少1。我认为多次致电WaitForSingleObject无法解决问题,因为:

  1. 准确的超时很难实现,并且

  2. 我想在num的所有资源都可用时处理数据(写入磁盘)(更快地写入更大的数据)。因此,例如,如果分别锁定了少于num个资源,则我可能不得不下一次释放(紧接在我锁定之后)下一次,因为即使超时过去,其余资源仍然不可用。我认为这是一个糟糕的设计。需要帮助。

1 个答案:

答案 0 :(得分:0)

在线搜索之后,我认为没有没有简单且官方的方法来实现带有多个锁的信号灯。 System V支持这种信号量,但是我认为在Windows上使用它很尴尬。

相反,我选择使用@MayurK提到的条件信号机制(基于pthreads),由一个生产者(获取数据)和一个消费者(将数据存储到磁盘)使用。为了使事情变得容易,我实现了一个缓冲区句柄实用程序Flex-Buffer并将其托管在Github上。希望它能帮助其他有类似问题的人。