だから、私はこの問題に1時間以上戸惑っています。
バックグラウンド:
テストしたいxv6のカーネル スレッドの実装があります。
スレッドは、フィールド ret_val を介して戻り値を通信します。
各スレッドは、戻り値を他のスレッドのret_val に保存します (値を返した後に技術的に割り当てを解除できるため)。
私のコードには、期待どおりに動作しない部分が 2 つあります。
*注意:フィールドproc->ret_val は void 型です **フィールドproc- >has_waiting はstruct proc 型です *
パート 1 (これはプロセスの構造体に戻り値を格納する部分です):
// store value in WAITING THREAD's ret_val.
(*proc->has_waiting->ret_val) = (void*)ret_val;
cprintf("(t_exit)process %d is taking the return value %s\n", proc->pid, (char *)ret_val);
cprintf("(t_exit)process %d now has return value from %d -> %s\n", proc->has_waiting->pid, proc->pid, (char *)(*proc->has_waiting->ret_val));
この ^ 部分の仕事は、プロセスの ret_val (プロセスの構造へのポインタである「has_waiting」フィールド内) に値を格納することです。
プリントは値が実際に保存されていることを示しているため、これは機能しているようです。
パート 2 (これは、プロセスの struct ret_val フィールドを読み取ろうとする部分です):
cprintf("(t_join) process %d is taking the return value %s\n", proc->pid, (char *)(*proc->ret_val));
* ret_val = proc->ret_val; // it's t's duty to set proc's ret_val
この ^ 部分の仕事は、破壊される前に構造体の構造 (ret_val フィールド) 内から値を復元することです。
パート 2 は機能しません。ret_val フィールドが空です。
あらゆる種類のキャスト操作を試しましたが、ここで基本的な概念を誤解しているようです。
アドレス指定している構造体が正しい構造体であることを、ID (一意) を出力して確認しました。
(ret_val で) 渡している値は、プロセスを作成するメイン関数で定義した静的文字列 (char*) です (破棄されていないことを確認したかったなど)。
助けていただければ幸いです。さらに情報が必要な場合はお知らせください。