2017-07-11 10 views
1

スレッドAで作成されたファイバを、スレッドBで作成された別のファイバに切り替えることはできますか?問題をより具体的にするために、いくつかのオペレーティングシステムでは、ネイティブにファイバーが実装されています(windows fibers)、
(Linuxなどでsetjump longjumpを使用して)独自に実装する必要があります。例えば繊維は糸間を移動できますか?

Libcoroは、(窓のためには、Linux用のそれなど自体を実装し、ネイティブファイバ用の単なるラッパーです)、単一のAPIでこのすべてを包み込む

だから、それはスレッド間の繊維を移行することができます場合は、 c/C++でwindows(linux)の使用例を教えていただけますか?

ブーストライブラリdocumentationでファイバーマイグレーションについて知りましたが、その実装とプラットフォームの依存性については具体的ではありません。私はまだWindowsファイバーのみを使って自分自身でやる方法(あるいはLinuxのLibcoroを使う方法)を理解したいと思っています。

一般的な方法ではできない場合は、、なぜですか?

私は、繊維は、単一のスレッド上で協調的マルチタスクのためにlightweight threadsとして使用されることを意図している、彼らは通常の糸に比べて安価なコンテキストの切り替えを持っている、と彼らはプログラミングを簡素化することを理解しています。 例としては、いくつかのスレッドがあり、それぞれが親スレッド上で何らかの種類の作業階層を実行している(親スレッドを離れることはありません)。

意図した用途ではありませんが、一般的なやり方で可能な場合でもそれを実行する方法を学びたいと思っています。スレッド間でファイバを移行することで仕事システムの作業負荷を最適化できると思うからです。

+2

少なくともWindowsファイバの場合、答えは「はい」です。 [SwitchToFiber'のドキュメント(https://msdn.microsoft.com/en-us/library/windows/desktop/ms686350.aspx)から: "SwitchToFiberを、あなたが作成したファイバーのアドレスで呼び出すことができます別のスレッド。 –

+0

「ファイバー」は大まかに定義された用語なので、一般的な答えはないと思います。基本的に、ファイバはスレッドから実行状態を取得します。それゆえ、疑問はそれが完全な状態を捕らえるかどうかです。 – MSalters

答えて

1

上記のboost.fiberは、コンテキスト切り替えを実装するためにboost.context(callcc/continuation)を使用します。 boost-1.64 callccがアセンブラでのみ実装されている場合、boost-1.65ではアセンブラ、Windows Fibers(Windows)またはucontext(POSIXの場合はPOSIXによって推奨されないAPI)を選択できます。 アセンブラの実装は、他の2つよりも高速です(ucontextと比較して2桁大きい)。

boost.fiberは、callccを使用して軽量スレッド/ファイバを実装しています。このライブラリは、スレッド間でファイバを移行できるようにするファイバスケジューラを提供します。 例えば、提供されたスケジューラは、実行キューが消滅した場合(準備ができている/再開できるファイバ)、他のスレッドからファイバを盗みます。

(したがって、スレッド間で移行されるWindows Fibreを選択できます)。

+0

あなたの答えは非常に有益で有益ですが、私の質問に直接答えません。 boost.context(callcc/continuation)を使用して安全な方法でスレッド間を移行する方法の例を追加できますか(別のスレッドで作成されたコンテキストをクリーニングするときにスタックの破損はありません)。 – DontCareBear

関連する問題