UNIX環境では、makecontext()/swapcontext()
ファミリーの関数がC言語でコルーチンを実装するために使用されることがありますが、これらの関数はスタックと実行フローを直接操作します。 CからC++に切り替えるときに、これらの低レベルの機能性がかなり異なることがよくあります。makecontext()/ swapcontext()関数はC++と互換性があります
したがって、makecontext()
とswapcontext()
を使用してコルーチンを実装することに問題がある場合はどうでしょうか。もちろん、明らかに、非常に良い注意を払う必要があります。例外は、このようなコルーチンを回避することはできません。なぜなら、スタックには例外ハンドラがなく、プログラムはおそらくセグメンテーションになるからです。しかしそれ以外には、C++が内部的に処理する方法との間に互換性がなく、makecontext()
とsetcontext()
は実行パスを変更しますか?
私はこれらの機能について聞いたことがありません。あなたは[POSIX 2001](http://pubs.opengroup.org/onlinepubs/009695399/functions/makecontext.html)がすでにスレッドのために時代遅れになっていることを認識していますか? –
@larsmans:残念です。コルーチンで簡単にできるものはスレッドではるかに難しいです。もちろん、スレッドでコルーチンをエミュレートすることはできますが、オーバヘッド(同期!)のみで、他のブロックがブロックされた状態でいつでも1つのスレッドしか実行されていない場合は、本当にスレッド化の対象ではありません。 – celtschk