当在fiber.detach()之后执行时

when execute after fiber.detach()?

本文关键字:之后 执行 fiber detach 当在      更新时间:2023-10-16
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;
}

程序输出:Before join。后加入。你好,boost::纤维。

为什么不输出:Before join。

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

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

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

'enumeration launch '指定控制是否立即传递到新启动的光纤。'

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 -但是你想要调度,所以输出是:

你好,boost::纤维在加入之前。后加入。

它永远不会打印:'Before join。你好,boost::fiber加入后。"因为你放了

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

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