c++ - 我可以只用事件、互斥量和信号量实现公平的 "wait on multiple events"吗?

标签 c++ c multithreading mutex semaphore

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

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

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

[3] 我说的是“事件”,但它可能是使用任何这些原语的新对象类型。

最佳答案

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

关于c++ - 我可以只用事件、互斥量和信号量实现公平的 "wait on multiple events"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254287/

相关文章:

c++ - 更好地控制我的客户区(WIN32)

c++ - 在 VIsual Studio 错误 NewFolder 中运行 MFC C++ 代码不是有效的工作目录

使用 GIO 库创建 FTP 挂载

c++ - 使用 C 头文件错误编译 Cython

c++ - 在 C++ 中,为什么仅包含 union 及其基类实例的派生类占用的内存大于 union 的大小?

c - 为什么我的顶点法线会随着相机旋转而旋转?

java - 客户端在多线程客户端/服务器应用程序上断开连接

java - 线程安全策略

java - 服务并发请求的 Tomcat 服务器

c++ - 添加项目到 QListWidget 添加设计时间