我将首先说我第一次深入研究多线程。尽管阅读了很多关于并发和同步的文章,但我并没有很容易地看到满足我所得到要求的解决方案。
使用 C++11 和 Boost,我试图弄清楚如何将数据从工作线程发送到主线程。工作线程在应用程序启动时产生并持续监控无锁队列。对象以不同的时间间隔填充此队列。这部分正在工作。
一旦数据可用,它需要由主线程处理,因为另一个信号将被发送到应用程序的其余部分,而不能在工作线程上。这就是我遇到的麻烦。
如果我必须通过互斥锁或条件变量阻塞主线程,直到工作线程完成,那将如何提高响应能力?我还不如只使用一个线程,这样我就可以访问数据了。我一定在这里遗漏了一些东西。
我已经发布了几个问题,认为 Boost::Asio 是要走的路。有一个如何在线程之间发送信号和数据的示例,但正如响应所示,事情很快变得过于复杂并且无法完美运行:
在不同线程上发布工作时如何将信号连接到 boost::asio::io_service?
Boost::Asio 与 Main/Workers 线程 - 我可以在发布工作之前启动事件循环吗?
与一些同事交谈后,建议使用两个队列——一个输入,一个输出。这将在共享空间中,并且输出队列将由工作线程填充。工作线程一直在运行,但可能需要一个计时器,可能在应用程序级别,这将强制主线程检查输出队列以查看是否有任何待处理的任务。
关于我应该将注意力集中在哪里的任何想法?是否有任何技术或策略可能适用于我正在尝试做的事情?接下来我会看Timers。
谢谢。
编辑:这是用于后处理模拟结果的插件系统的生产代码。我们尽可能首先使用 C++11,然后是 Boost。我们正在使用 Boost 的 lockfree::queue。应用程序在单个线程上执行我们想要的操作,但现在我们正在尝试优化我们发现存在性能问题的地方(在这种情况下,计算是通过另一个库进行的)。主线程有很多职责,包括数据库访问,这就是为什么我想限制工作线程实际做的事情。
更新:我已经成功地使用 std::thread 启动了一个工作线程,该线程检查 Boost lock::free 队列并处理放置它的任务。这是@Pressacco 响应中的第 5 步,我遇到了麻烦。当工作线程完成并通知主线程而不是简单地等待工作线程完成时,是否有任何示例向主线程返回值?