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