2012-02-13 11 views
9

UNIX環境では、makecontext()/swapcontext()ファミリーの関数がC言語でコルーチンを実装するために使用されることがありますが、これらの関数はスタックと実行フローを直接操作します。 CからC++に切り替えるときに、これらの低レベルの機能性がかなり異なることがよくあります。makecontext()/ swapcontext()関数はC++と互換性があります

したがって、makecontext()swapcontext()を使用してコルーチンを実装することに問題がある場合はどうでしょうか。もちろん、明らかに、非常に良い注意を払う必要があります。例外は、このようなコルーチンを回避することはできません。なぜなら、スタックには例外ハンドラがなく、プログラムはおそらくセグメンテーションになるからです。しかしそれ以外には、C++が内部的に処理する方法との間に互換性がなく、makecontext()setcontext()は実行パスを変更しますか?

+0

私はこれらの機能について聞いたことがありません。あなたは[POSIX 2001](http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html)がすでにスレッドのために時代遅れになっていることを認識していますか? –

+6

@larsmans:残念です。コルーチンで簡単にできるものはスレッドではるかに難しいです。もちろん、スレッドでコルーチンをエミュレートすることはできますが、オーバヘッド(同期!)のみで、他のブロックがブロックされた状態でいつでも1つのスレッドしか実行されていない場合は、本当にスレッド化の対象ではありません。 – celtschk

答えて

6

私は以前にC++コードでmakecontext()/swapcontext()を使用しました。あなたが言うように、注意すべき主なものは例外です。それ以外は何の問題もありませんでした。標準に従って陳腐化しているにもかかわらず、UNIXのようなオペレーティングシステムは依然として十分サポートされています。 (Mac OS Xの警告があります:の前に#includingの関連ヘッダが必要です)。それらを廃止する理由はかなり不自由です。それらをpthreadsのようなバージョンに置き換えることができます。単一のvoid *引数。

あなたが言うように、スレッドは有用な代替物ではないので、先に進んでswapcontext()を使用します。あなた自身のバージョンの機能をローリングするのに、this blog postが面白いかもしれません。

+0

興味深い投稿(私はコルーチンの最善の利用はおそらく細かいタイムスライシングや短命のインスタンスではないと感じていますが、引用されたオーバーヘッドが最悪の場合があります)。とにかく、例外をスローするのを避けてください。それ以外の場合は、[C++プロジェクト](http://code.google.com/p/crag/source/browse/)でmake/swapcontext(およびWindowsファイバーと同様)を使用しても問題ありません。 src/smp/FiberPosix.cpp)。 –

関連する問題