0

だから、私はこの問題に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*) です (破棄されていないことを確認したかったなど)。

助けていただければ幸いです。さらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

これを正しく読んでいれば、このフィールドを介して値を「返す」ことができます。

proc->has_waiting->ret_val

ただし、このフィールドを介して参照します。

proc->ret_val

両方の場所で同じ参照を使用する必要があります。

編集:これを単純化しret_valchar *?

于 2013-05-08T21:30:48.627 に答える