fiber.detach() 之后什么时候执行?
when execute after fiber.detach()?
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(部分:枚举启动):
'enumeration launch specifies whether control passes immediately into a newly-launched fiber.'
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::fiber
加入前。
加入后
永远不会打印:'Before join. Hello, boost::fiber After join.'
因为你把
cout << "Before join." << endl;
之后
boost::fibers::fiber f(helloFiber, std::move(ft));
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(部分:枚举启动):
'enumeration launch specifies whether control passes immediately into a newly-launched fiber.'
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::fiber 加入前。 加入后
永远不会打印:'Before join. Hello, boost::fiber After join.' 因为你把
cout << "Before join." << endl;
之后
boost::fibers::fiber f(helloFiber, std::move(ft));