4

私はユーザースペースのスレッドライブラリを書いています。各スレッドを管理する構造体があります。私のスレッドは非常に単純で、関数ptrとその引数を取り、その関数を1回実行するだけです。

各スレッドにはjmp_bufがあり、setjmpとlongjmpを使用してスレッドを切り替えます。私が理解できないことの1つは、この関数がいつ終了したかを知る方法です。

スレッドごとに、2つの方法でjmpbufを変更します。

  1. PCを編集して関数ポインタに設定したので、次にプログラムカウンターがそこに行きます。
  2. また、それぞれに独自のスタックを作成し、そのスタックを指すようにSPを編集します

したがって、スレッド制御構造体を使用して、スレッドを切り替え、各スレッドに状態を維持させることができますが、その関数がいつ終了したかを知る方法がわかりません。それが終わったら、私が持っている特別なexit()関数を呼び出したいと思います。

4

3 に答える 3

2

スタック上のリターンアドレスを変更してexit()関数を指すようにするか、関数呼び出しを、その後にexit()を呼び出す別の関数でラップすることができます。

于 2009-10-29T20:26:27.497 に答える
2

run_thread()PC をユーザー関数に変更する代わりに、実際には、そのスレッドのエントリ関数に分岐する特別な関数 (と呼びましょう) を呼び出す必要があります。そのエントリ関数が戻ったとき (つまり、スレッドが終了したとき)、このスレッドが終了run_thread()したことを示すために必要なすべての作業を行う必要があります (おそらく、スケジューリング リストからそのスレッド制御ブロックを削除し、それを join() クリーンアップ リストに追加することによって) )。その後、生成され、親がその ID で join() を呼び出すと、クリーンアップされます。

于 2009-10-29T20:41:00.063 に答える
0

create_thread元々呼び出されていた場所、おそらくあなたの関数に戻ろうとします。

于 2009-10-29T20:26:37.200 に答える