如果我开始 thread在主线程中,是否有任何选项可以 Hook 新线程将要触发的回调。回调应该在主线程中执行。
目前我正在使用 future对于这个任务,但我想避免等待结果(结果是 bool 值,如果 true
一切正常,如果 false
我需要重新启动线程来尝试做任务)。
在 c++11 中有类似于 node.js/javascript 回调的东西吗?
最佳答案
在当前标准 C++ 中没有明确要求这样做。
std::future::then()
处于标准化流程中,可能包含在 C++1y 或 TR 中。
有几个第三方库支持这个习惯用法:
- Boost.Thread
- 英特尔 Threading Building Blocks (TBB)
- OpenMP
- 微软 Parallel Patterns Library (PPL) [仅限 Windows]
- 微软 Casablanca
相关:Asio是一个 C++ 异步 I/O 库,它只支持非阻塞 I/O 操作的这个习惯用法,而不是一般的计算操作。 (Node.js 主要用于 I/O,所以这可能就足够了。)
否则,您可以自行解决:
auto myFuture = std::async([](){
doWork();
}).share();
auto myNextFuture = std::async([=](){
myFuture.wait();
doMoreWork();
});
您可以将它打包成一个可重用的助手:
template <typename Future, typename Work>
auto after(Future f, Work w) -> std::future<decltype(w())>
{
return std::async([=]() -> decltype(w()) { f.wait(); return w(); });
}
然后像这样使用它:
auto myFuture = std::async([](){
doWork();
});
auto myNextFuture = after(myFuture.share(), [](){
doMoreWork();
});
使用这种方法,您需要支付额外线程的费用(可能)。
相关:C++ Concurrency Herb Sutter 的演讲。
关于c++ - 在 c++11 中,线程是否类似于 node.js/javascript 回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23329578/