2016-10-27 5 views
1
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; 
} 

このプログラムは、以下を出力します。参加する前に。参加した後。こんにちは、ブースト::繊維。fiber.detach()の後に実行すると?

なぜ出力されないのですか:参加する前に。こんにちは、ブースト::繊維参加後。

+0

後にそれはなぜ必要がありますか?特定のシーケンスで実行が予想される場合は、シーケンシャルコードを記述する必要があります。さもなければ、不当な仮定をしないでください。 –

+0

創作後のファイバーがすぐに実装されることを願っています。しかし、適切なメソッドを見つけることができないようですが、fib.join()メソッドがブロックされています。私はブロッキングではなく、すぐに実行されて見つけることを望む –

答えて

0

helloFiber()のシグネチャを、将来(将来を移動する)ためのrvalue参照に変更する必要があります。

ファイバーを切り離すので、スケジューラーはそれに参加しなければなりません(破壊時の例では)。 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がポストである - しかし、出力があるので、あなたは、派遣をしたい:

こんにちは、後押し::繊維 に参加する前に。 参加後。

これは決して印刷されません: '参加する前に。こんにちは、ブースト::繊維の後に参加してください。 あなたが置くので

​​

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

ええ、あなたは正しい、私は打ち上げを失った:: dispath。ありがとう。 –

関連する問題