2011-09-16 14 views
3

ユーザーレベルのスレッドライブラリを実装しようとしています。 Getcontext関数は、現在のスレッドのコンテキストをメモリに保存するために使用されます。機能のgetContextは Getcontext関数に関する質問

は、しかし、どちらの場合も、それは同じ値を返す新しいコンテキストを作成するには、現在のコンテキストを保存して、次のスレッド

  • に移動するには2例

    1. で使用されています。では、これらの2つのケースをどのように区別しますか?

      (、新しいスレッドにsetcontextを移動していないにgetcontextおかげ

  • 答えて

    9

    )とswapcontext()ん。新しいスレッドを作成するための

    1. 能力: あなたのスレッドライブラリは、少なくともこれら2の機能を実装する必要があります。

    2. 他のスレッドに切り替えることができます。

    は、最初のケースでは、あなたは、あなたが開始機能とコンテキストを初期化するためにMAKECONTEXT()を呼び出し、ucontext_tを初期化し、スタックにメモリを割り当て、ucontext_tにスタックポインタを設定する()にgetcontextを呼び出します。

    2番目のケースでは、getcontext()を呼び出して現在のスレッドのコンテキストを保存し、setcontext()を呼び出して以前に格納した別のスレッドに切り替えます。または、より一般的には、swapcontextを使用してget/setcontext呼び出しを結合します。 hereはget/setcontextで協調スレッドを実装する非常に簡単な方法です。

    +0

    お返事いただきありがとうございます:-)私は別の質問があります。 getcontext、setcontext、makecontext、swapcontext関数にシグナルの安全性に関する問題はありますか?もしあれば、正確に何が起こるのか説明できますか? – CuriousCoder

    +0

    さて、http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.htmlによると、これらの関数はシグナルセーフではありません。つまり、あなたが求めているのであればシグナルハンドルでそれらを使うことはできません。もしあなたがそうしたら、何が起こるのだろうと推測するのは無意味です。 – nos