我可以用事件,互斥体和信号量实现公平的“等待多个事件”吗?

时间:2014-08-12 00:03:49

标签: c++ c multithreading mutex semaphore

在只有事件[1],互斥体和信号量[2]的平台上,我可以创建一个公平的"等待多个事件"在发出信号/设置任何事件[3]时返回的实现。我假设现有的原语是公平的。

[1]事件是"标志"有4个操作:Set(),Clear(),Wait()和WaitAndClear()。如果你在一个未设置的事件上等待(),你就会阻止,直到某人Set()为止。 WaitAndClear()听起来像是原子的。所有的服务员都被唤醒了。

[2]我不相信系统支持信号量值变为负值。

[3]我说" events",但它可能是一个使用任何这些原语的新对象类型。

2 个答案:

答案 0 :(得分:2)

对于Windows,第三个参数设置为false的WaitForMultipleObjects应该有效(还包括超时选项)。我还看到了为X86(80186)嵌入式设备中使用的内部开发的小内核实现了类似的等待功能。对于内部内核,如果最大线程数是固定的,则每个事件(信号量,...)可以具有针对该对象上待处理的任何线程的任务控制块地址数组。另一个选择是制定一个规则,只有一个线程可以等待任何事件,信号量,...,(每个对象类型只有一个条目,包含null或待处理任务控制块的地址),在这种情况下需要触发多个线程的地方,将使用多个事件或信号量。

答案 1 :(得分:1)

您需要以下其中一项:

  • 非阻塞事件测试程序
  • 现成原语,例如WaitForMultipleObjects
  • 每个等待对象一个线程,加上一些开销

如果你不能拥有其中之一,我认为它不可行。