c++ - fiber.detach() 之后什么时候执行?

标签 c++ boost fiber

void helloFiber(boost::fibers::future<void> &f)
{
    cout << "Hello, boost::fiber" << endl;
    f.get();
}

int main()
{
    boost::fibers::promise<void> pm;
    boost::fibers::future<void> ft = pm.get_future();
    {
        boost::fibers::fiber f(helloFiber, std::move(ft));
        cout << "Before join." << endl;
        f.detach();
    }
    pm.set_value();
    cout << "After join." << endl;
    return 0;
}

这个程序输出:加入之前。加入后。你好,boost::fiber。

为什么不输出:加入之前。你好,boost::fiber 加入后。

最佳答案

您应该将 helloFiber() 的签名更改为对 future 的右值引用(您移动了 future )。

因为您分离了纤程,所以调度程序必须加入它(在您的示例中,在销毁时)。

请看:http://www.boost.org/doc/libs/1_62_0/libs/fiber/doc/html/fiber/fiber_mgmt.html (部分:枚举启动):

“枚举启动指定控制是否立即传递到新启动的光纤中。”

boost::fibers::fiber f( boost::fibers::launch::post, helloFiber, std::move(ft));
boost::fibers::fiber f( boost::fibers::launch::dispatch, helloFiber, std::move(ft));

默认是 post - 但你想要 dispatch,所以输出是:

你好,boost::fiber 加入前。 加入后。

它永远不会打印:'加入之前。你好,boost::fiber 加入后。 因为你把

cout << "Before join." << endl;

之后

   boost::fibers::fiber f(helloFiber, std::move(ft));

关于c++ - fiber.detach() 之后什么时候执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289626/

相关文章:

java - 我可以将类星体中的 SettableFuture 假设为光纤吗?

c++ - 什么是 C 扩展?

c++ - 如何在循环中表示不再输入字符串 ss while (cin >> ss)

c++ - 如何批量分配 boost::ptr_vector 并调用存储类的构造函数?

c++ - opencv::Mat 是什么类型的对象?它是 shared_ptr 还是 auto_ptr ?它是一个指针吗?

c++ - 分段堆栈如何工作

c++ - 如何创建一个类对象数组,其构造函数只需要很少的参数?

c++ - vector::erase() 会改变位置吗?

c++ - 如何通过索引访问 boost::multi_index::multi_index_container<> 的所有元素?

fiber - 纤维有优先级吗?