在c ++ 11中,类似于针对node.js/javascript回调的线程吗?

Dam*_*mir 3 c++ c++11

如果我从主线程启动一个线程,是否有任何选项来挂钩新线程将要触发的回调.回调应该在主线程中执行.

目前我正在使用future来完成这项任务,但是我想避免等待结果(结果是boolean,以防true一切正常,以防false我需要再次启动线程来尝试执行任务).在c ++ 11中类似于node.js/javascript回调吗?

Okt*_*ist 5

当前的标准 C++中没有明确的做法.

std::future::then() 在标准化管道中,可以包含在C++ 1y或TR中.

有几个第三方库支持这个成语:

相关:Asio是一个C++异步I/O库,它支持这个习惯用于非阻塞I/O操作,而不是一般的计算操作.(Node.js主要用于I/O,所以这可能就足够了.)

否则,您可以推出自己的解决方法:

auto myFuture = std::async([](){
    doWork();
}).share();
auto myNextFuture = std::async([=](){
    myFuture.wait();
    doMoreWork();
});
Run Code Online (Sandbox Code Playgroud)

您可以将其打包成可重用的帮助程序:

template <typename Future, typename Work>
auto after(Future f, Work w) -> std::future<decltype(w())>
{
    return std::async([=]() -> decltype(w()) { f.wait(); return w(); });
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

auto myFuture = std::async([](){
    doWork();
});
auto myNextFuture = after(myFuture.share(), [](){
    doMoreWork();
});
Run Code Online (Sandbox Code Playgroud)

使用这种方法,您可以支付额外线程的费用(可能).

相关:Herb Sutter的C++ Concurrency谈话.