を使用してユーザーレベルのスレッド lib を実装していますucontext_t
。を介してスレッドをスケジューラ スレッドにリンクしていますuc_link
が、場合によっては戻り値を取得する必要があります。コンテキストが分かれているため、戻り値を取得する方法がわかりません。戻り値にアクセスする唯一の方法は、何らかの方法でそのコンテキストのスタックに移動し、戻り値がどこにあるかを見つけることです。ただし、これは災害と奇妙なエラーの公式のようです。
1 に答える
終了時に ucontext から戻り値を取得する
で表されるような実行コンテキストにはucontext_t
戻り値がありません。これは、エントリポイント関数が終了するときの動作で暗黙的であり (後続のコンテキストがあればアクティブ化されます)、エントリポイント関数のシグネチャで明示的です (それは を返しますvoid
)。
makecontext()
また、エントリポイント関数は、任意の固定数の引数を取ることができますが、それ自体とは異なり、さらに非可変長でなければならないことに注意してください。の呼び出し元はmakecontext
、正しい引数の数とその数の引数を指定する義務がありますint
。
コンテキスト間でデータをやり取りしたい場合は、後で別のコンテキストでデータを取得できる共有メモリの場所にデータまたはそのポインタを書き込む必要があります。おそらく、この場合、lib がスレッドごとに維持するメタデータのどこかにあるでしょう。
問題のデータが何らかの関数の戻り値である場合、その関数をコンテキストのエントリ ポイントにすることはできません。その場合 (およびその他の理由でも)、ユーザーが提供する関数を ucontext エントリ ポイントとして使用することは避けたい場合があります。代わりに、ライブラリによって内部的に提供される関数を使用してください。この関数は、ユーザー関数をブートストラップする方法と、それが返されたときに何をすべきかを認識しています。