C++11 - 可以等待多个不同事件的线程?

C++11 - Thread that can wait on several different events?

本文关键字:事件 线程 等待 C++11      更新时间:2023-10-16

我正在C++编程一个餐厅模拟,以获得语言练习,尤其是C++11线程。

我打算使用可以执行以下操作的线程服务器类(即服务员):

  • 接收有关新工作被发布到全局餐桌的通知并接受该工作(即为刚刚进入餐厅的一方安排座位)

  • 接收准备下订单并接受工作的一方的通知(即访问派对的餐桌,接受他们的订单并将其提交给酒吧或厨房的工作队列)

  • 订单
  • 完成后收到通知,从厨房或酒吧取下订单并将其送到正确的桌子

这里最大的问题是,我想要的行为类似于同时等待几个条件变量,我已经从这篇文章中读到这是不可能的。

我宁愿不要使用繁忙的等待,因为这些任务可能需要几分钟或更长时间,这是大量不必要的 CPU 消耗。

最有可能的是,我认为我将希望采用条件变量和增强信号的某种组合,但我不确定如何将其设计为最有效和简洁。

任何关于设计或阅读的建议都非常感谢。

提前感谢!

当我需要一个线程一次等待多件事时,我发现 select() 可以很好地作为实现该行为的基础。 特别是,您可以将select()设置为阻塞,直到一组指定的套接字中的至少一个准备好在其传入数据缓冲区中读取数据。

那么,当您的程序与网络无关时,这有什么用呢? 因为您可以在生成线程之前调用 pipe() 或套接字(),并将管道的接收端(或套接字对的任一端)传递给线程以使其select()。 然后,当另一个线程希望该线程唤醒并执行某些操作时,它可以将()虚拟字节写入管道/套接字对的另一端,这将导致select()线程从select()返回,然后FD_ISSET()将指示接收套接字已准备好读取。 基于此,线程可以读取()在其文件描述符上收到的虚拟字节(并丢弃它们),然后执行任何适当的操作。 之后,它可以再次调用select()返回睡眠状态,直到收到下一个传入的"触发字节"。

如果线程之间必须传递很少或没有数据,以上内容足以进行简单的"嘿,现在做点什么"式的通信;对于更复杂的数据传递,我通常将上述触发机制与某种受互斥保护的命令/消息对象的FIFO队列相结合,这样"触发"线程将一个或多个消息对象添加到FIFO队列中, 然后发送虚拟字节,"接收"线程在从select()唤醒后,将从其FIFO队列中获取所有消息对象,然后依次处理每个消息对象。