0

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

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

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

目前在 Windows 上,WaitForSingleObject将对象的计数减少1. 我认为WaitForSingleObject多次调用无法解决问题,因为:

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

  2. num我想在资源全部可用时处理数据(写入磁盘) (写入更大尺寸的数据更快)。因此,例如,如果少于 num 资源被单独锁定,那么我可能不得不释放(在我锁定之后)它们以供下次使用,因为即使超时通过,其余的资源仍然不可用。我认为这是一个糟糕的设计。需要帮助。

4

1 回答 1

0

网上搜索了一下,觉得没有一个简单正式的方法可以实现一个带多锁的信号量。System V 支持这种信号量,但我认为在 Windows 上使用它很尴尬。

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

于 2019-06-15T13:00:08.720 回答