0

を使用してユーザーレベルのスレッド lib を実装していますucontext_t。を介してスレッドをスケジューラ スレッドにリンクしていますuc_linkが、場合によっては戻り値を取得する必要があります。コンテキストが分かれているため、戻り値を取得する方法がわかりません。戻り値にアクセスする唯一の方法は、何らかの方法でそのコンテキストのスタックに移動し、戻り値がどこにあるかを見つけることです。ただし、これは災害と奇妙なエラーの公式のようです。

4

1 に答える 1

1

終了時に ucontext から戻り値を取得する

で表されるような実行コンテキストにはucontext_t戻り値がありません。これは、エントリポイント関数が終了するときの動作で暗黙的であり (後続のコンテキストがあればアクティブ化されます)、エントリポイント関数のシグネチャで明示的です (それは を返しますvoid)。

makecontext()また、エントリポイント関数は、任意の固定数の引数を取ることができますが、それ自体とは異なり、さらに非可変長でなければならないことに注意してください。の呼び出し元はmakecontext、正しい引数の数とその数の引数を指定する義務がありますint

コンテキスト間でデータをやり取りしたい場合は、後で別のコンテキストでデータを取得できる共有メモリの場所にデータまたはそのポインタを書き込む必要があります。おそらく、この場合、lib がスレッドごとに維持するメタデータのどこかにあるでしょう。

問題のデータが何らかの関数の戻り値である場合、その関数をコンテキストのエントリ ポイントにすることはできません。その場合 (およびその他の理由でも)、ユーザーが提供する関数を ucontext エントリ ポイントとして使用することは避けたい場合があります。代わりに、ライブラリによって内部的に提供される関数を使用してください。この関数は、ユーザー関数をブートストラップする方法と、それが返されたときに何をすべきかを認識しています。

于 2022-03-03T15:54:18.710 に答える