c++ - 在 c++11 中,线程是否类似于 node.js/javascript 回调?

标签 c++ c++11

如果我开始 thread在主线程中,是否有任何选项可以 Hook 新线程将要触发的回调。回调应该在主线程中执行。

目前我正在使用 future对于这个任务,但我想避免等待结果(结果是 bool 值,如果 true 一切正常,如果 false 我需要重新启动线程来尝试做任务)。 在 c++11 中有类似于 node.js/javascript 回调的东西吗?

最佳答案

当前标准 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();
});

您可以将它打包成一个可重用的助手:

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/

相关文章:

c++ - 检查 std::move 是否在容器上完成

C++0x 中的 C# 样式 Action<T>、Func<T,T> 等

c++ - 如何为 x86 和 x64 架构构建 boost 通用库?

c++ - 跳过显式模板初始化以避免双重初始化

c++ - 链接器无法在命名空间中找到函数定义

c++ - auto_ptr 与 shared_ptr 的性能对比

pointers - 无法将对象转换为指针 C++

C++ 对值的引用,而不是复制

c++ - 在 C++ 中声明返回字符串的函数

c++ - 这两个构造函数调用之间的区别