事件管理器使用信号和线程

时间:2011-11-07 14:44:39

标签: c++ multithreading boost bind signals

我想知道使用Boost :: signals2和Boost :: thread构建多线程事件系统的最佳方法是什么。

在我的项目中,我有一个网络类,用于侦听线程中的传入连接。当玩家连接时,该类应该能够将事件引发到我的服务器处理程序类和其他侦听信号的函数。事实上,服务器和其他函数也可以在线程中,并且被调用的函数不能与网络类上下文有关,而是在订阅事件的上下文中。

最好的方法是什么?我听说过轮询,但我不确定如何使用线程和信号来使用它。

tldr:能够收听其他线程中的信号。

2 个答案:

答案 0 :(得分:2)

据我了解,提升信号2并不能满足您的需求。它是线程安全的,但它不能为你在另一个线程上执行代码。

听起来我应该将事件放入队列而不是尝试使用信号。您的消费者线程可以直接阻塞,直到队列中有可用的事件。

是否要求您必须将信号用作解决方案的一部分?

答案 1 :(得分:2)

既然您正在编写基于网络的代码,您是否考虑过boost asio

简单地说,从多个线程调用boost :: asio :: io_service :: run允许您以多线程方式处理事件。此外,您可以使用io_service :: post将工作发布到io_service,这将导致工作由run方法上阻塞的线程中的io_service执行。有关详细信息,请阅读此SO post。 game-dev链接提供了对asio以及如何使用它的精彩介绍。 asio还提供了一种民意调查方法,还有更多。

对我而言,听起来像asio非常适合你想要实现的目标。