C++11 - 可以等待多个不同事件的线程?
C++11 - Thread that can wait on several different events?
我正在C++编程一个餐厅模拟,以获得语言练习,尤其是C++11线程。
我打算使用可以执行以下操作的线程服务器类(即服务员):
-
接收有关新工作被发布到全局餐桌的通知并接受该工作(即为刚刚进入餐厅的一方安排座位)
-
接收准备下订单并接受工作的一方的通知(即访问派对的餐桌,接受他们的订单并将其提交给酒吧或厨房的工作队列)
订单 完成后收到通知,从厨房或酒吧取下订单并将其送到正确的桌子
这里最大的问题是,我想要的行为类似于同时等待几个条件变量,我已经从这篇文章中读到这是不可能的。
我宁愿不要使用繁忙的等待,因为这些任务可能需要几分钟或更长时间,这是大量不必要的 CPU 消耗。
最有可能的是,我认为我将希望采用条件变量和增强信号的某种组合,但我不确定如何将其设计为最有效和简洁。
任何关于设计或阅读的建议都非常感谢。
提前感谢!
当我需要一个线程一次等待多件事时,我发现 select() 可以很好地作为实现该行为的基础。 特别是,您可以将select()
设置为阻塞,直到一组指定的套接字中的至少一个准备好在其传入数据缓冲区中读取数据。
那么,当您的程序与网络无关时,这有什么用呢? 因为您可以在生成线程之前调用 pipe() 或套接字(),并将管道的接收端(或套接字对的任一端)传递给线程以使其select()
。 然后,当另一个线程希望该线程唤醒并执行某些操作时,它可以将()虚拟字节写入管道/套接字对的另一端,这将导致select()
线程从select()
返回,然后FD_ISSET()将指示接收套接字已准备好读取。 基于此,线程可以读取()在其文件描述符上收到的虚拟字节(并丢弃它们),然后执行任何适当的操作。 之后,它可以再次调用select()
返回睡眠状态,直到收到下一个传入的"触发字节"。
如果线程之间必须传递很少或没有数据,以上内容足以进行简单的"嘿,现在做点什么"式的通信;对于更复杂的数据传递,我通常将上述触发机制与某种受互斥保护的命令/消息对象的FIFO队列相结合,这样"触发"线程将一个或多个消息对象添加到FIFO队列中, 然后发送虚拟字节,"接收"线程在从select()
唤醒后,将从其FIFO队列中获取所有消息对象,然后依次处理每个消息对象。
- 一个线程等待多个线程事件
- C++11 - 可以等待多个不同事件的线程?
- C++uWebSockets将事件循环集成到一个线程中
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- Qt:工作线程和 GUI 事件之间的关系
- 限制空闲事件的回调率,而无需阻止线程而无需多线程
- QT:QT无法将事件发送到另一个线程拥有的对象 - 原因
- 重写多线程事件驱动的C 程序以使用单线程Boost :: Asio
- 事件发生时停止线程
- C++事件管理器多线程可靠
- c++ 过期映射条目线程与事件循环
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 提高 ASIO stream_descriptor和事件 FD 线程安全性
- 如何在C 中等待一组线程或其他事件
- 无法在另一个线程-QT中向对象发送已发布的事件
- FLTK 事件映射/多线程
- 定时与终止线程使用事件不一致
- MFC-在dll卸载时,扫描我的代码,任何剩余的计时器,事件,线程等
- 在运行线程中处理事件
- 在Qt GUI事件线程中检测该"I'm running"