【问题标题】:when execute after fiber.detach()?在 Fiber.detach() 之后执行什么时候?
【发布时间】:2016-10-27 16:16:48
【问题描述】:
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 加入后。

【问题讨论】:

  • 为什么要这样?如果您希望按特定顺序执行,则应编写顺序代码。否则不要持有无根据的假设。
  • 希望创建后的fiber马上实现。但是好像没有找到合适的方法,fiber.join() 方法被阻塞了。我希望找到一个不阻塞并立即执行

标签: c++ boost fiber


【解决方案1】:

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

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

请看: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));

deafult 是 post - 但你想要调度,所以输出是:

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

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

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

之后

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

【讨论】:

  • 是的,你是对的,我丢失了 launch::dispath。谢谢。
猜你喜欢
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2016-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多