如何在Windows中信号量值达到0之前等待/阻塞

时间:2009-07-24 05:32:32

标签: windows semaphore

在unix上使用semop()函数,可以提供semb_f = 0的sembuf结构。从本质上讲,这意味着调用进程将等待/阻塞,直到信号量的值变为零。在Windows中是否有相同的方法来实现这一点?

我试图实现的具体用例是在让作者写入之前等待读者数量达到零。 (是的,这是使用信号量的一种有点非正统的方式;这是因为读者数量没有限制,所以没有一组受限资源,这是信号量通常用来管理的)

有关unix semop系统调用的文档,请访问: http://codeidol.com/unix/advanced-programming-in-unix/Interprocess-Communication/-15.8.-Semaphores/

4 个答案:

答案 0 :(得分:3)

假设你有一个编写器线程,只需让编写器线程吞噬信号量。即,通过WaitForSingleObject获取信号量,无论你多少次将信号量计数初始化为。

答案 1 :(得分:2)

A Windows semaphore down 从最大值(允许的最大读取数)计为零。 WaitXxx函数等待非零信号量值并递减它,ReleaseSemaphore 递增信号量(允许等待信号量的其他线程解除阻塞) )。不可能以不同的方式在Windows信号量上等待,因此在您的情况下,Windows信号量可能是同步原语的错误选择。在Vista / 2008上,您可以使用slim read-write locks;如果你需要支持早期版本的Windows,你必须自己动手。

答案 2 :(得分:1)

我从未见过类似于Win32 API中的任何功能。

我认为这样做的方法是调用WaitForSingleObject或类似内容,并获得WAIT_OBJECT_0与创建信号量时指定的最大计数相同的次数。然后,您将保留所有可用的“插槽”,等待信号量的其他任何人都将阻止。

答案 3 :(得分:1)

  

我正在尝试实现的特定用例   是要等到读者人数达到   让作家写作之前为零。

你可以保证读者数量在作者完成之前保持为零吗?

如果是这样,您可以使用manual-reset event object实现SysV“等待零”行为的等效行为,表示最后一个读者的完成。保持自己(同步)的“活跃读者”数量,在读者完成时递减,然后在该计数为零时通过SetEvent()向耐心等待的作者发出信号。

如果你不能保证读者表现得很好,那么即使使用SysV sems,你也会遇到不愉快的比赛。