gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:10:13 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com