::Hikaru's blog

調べたこと, 考えたことをメモ.
<< October 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>

スポンサーサイト

一定期間更新がないため広告を表示しています

- | permalink | - | -
<< netshを使ってネットワーク接続の設定を変更する. | main | Visual Studio .NET 正規表現を使った置換 >>

Fiber

コンテキストを切り替えながら動作させたいが、 シーケンス上、お互いの処理が完了するのを待つ必要があるため、 シングルスレッドで十分だ、ということはないでしょうか。
こういう場合にはファイバが使えます。
ファイバは自由にコンテキストを切り替えることができ、 しかもユーザモードで動作するので高速です。

以下、サンプルコード。
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { // 現在のスレッドをファイバに変換する。 LPVOID pMain = ::ConvertThreadToFiber(NULL); // ファイバを作成する。 LPVOID pSub = ::CreateFiber(0, MyFiberProc, pMain); // ファイバを切り替える。 ::SwitchToFiber(pSub); // ファイバを削除する。 ::DeleteFiber(pSub); return 0; } VOID CALLBACK MyFiberProc(PVOID lpParameter) { // ここで処理を行う。  // ファイバを切り替える。 ::SwitchToFiber(lpParameter); }
Win32 | permalink | comments(4) | trackbacks(0)

スポンサーサイト

- | permalink | - | -

この記事に対するコメント

ファイバを使いたい状況に未だかつて一度もであったことないなぁ。
見逃してるだけかもしれないけど。

MyFiberProcの中で、SwitchToFiberせずにreturnしたり、例外発生したりしたらどうなるんかな?
akihiro | 2006/01/26 6:00 PM
MyFiberProcの中でreturnしてはいけないことになってるんだけど、どうなるんやろうね(笑)
Advanced Windowsには、ファイバとその上に作られた全てのファイバが削除されるって書いてあるけど。
試してみたらそこでプログラムが終了しました。

例外はスレッドと同じでファイバ内で処理しないとダメっすね。
hikaru | 2006/01/26 10:01 PM
ほうー、なるほど。

デストラクタでSwitchToFiberするクラスをつくっておけば、普通にreturnできてコードも綺麗になりそうやなー
akihiro | 2006/01/27 9:47 AM
なるほど。

Fiberの基本クラスを作って、継承して使うのが一番良いのかなぁ。
hikaru | 2006/01/27 10:57 AM
コメントする









この記事のトラックバックURL
http://hikarukaru.jugem.cc/trackback/81
この記事に対するトラックバック