【发布时间】:2015-02-20 12:35:54
【问题描述】:
在我当前的代码中,我有一个解决方案,它允许主线程安排一些作业在工作线程中异步执行。
当工作线程完成时,它应该使用提供的回调函数通知主线程。主要问题是我希望这个回调在主线程而不是工作线程中执行,所以在工作完成后从工作线程调用简单的函数不是一个选项(回调执行一些可能非常复杂的应用程序逻辑,并且我不希望工作线程忙于那个)。
我有一个针对该问题的旧式解决方案(使用事件向主线程发出工作已完成的信号等),但我正在寻找一些通用且可重用的解决方案 - C++ 中有什么可以使用的吗?
理想情况下,我正在寻找像 boost::signals 这样的解决方案,但据我所知,这不是线程感知的。有什么想法吗?
编辑:最终解决方案必须在 linux 上运行并使用 GCC 编译
EDIT2:添加了一些示例代码
回调的典型用法可能如下所示(这不会编译,但我想保持简单,以展示总体思路):
///////// main thread ////////////
void fun() { /* work to be done in worker thread */ }
void callback() { /* callback that will be called when fun() is done */ }
int main() {
Worker worker;
worker.doAsync(fun, callback);
// waiting for the worker to finish the job
}
////// worker thread code ///////
/// main worker loop
void Worker::run() {
// wait until the task is scheduled
// run the scheduled tasks
fun();
// when task was finished, call the callback
callback();
}
上面代码的问题是回调()函数将从工作线程中调用 - 我想要的是让工作线程向主线程发出工作完成的信号,并且主线程现在应该调用回调因为工作完成了。
【问题讨论】:
-
我认为您尝试完成的一些代码示例将有助于澄清。
-
boost::signals 已被弃用,取而代之的是线程安全的 boost::signals2。
-
您为什么将事件描述为遗留解决方案?
-
Oktalist,我的意思是我们的项目中有一些遗留代码正在解决这个问题(使用基于事件的系统,但这并不相关)。所有代码都是自定义解决方案。我有一种感觉,一定有某种标准工具可以在这里应用,而不是从头开始构建所有东西。
标签: c++ multithreading boost