所以,我对这个问题困惑了一个多小时。
背景:
我在xv6中有一个要测试的内核线程实现。
线程通过字段 ret_val 传递返回值。
每个线程都将返回值保存在另一个线程的ret_val 中(因为从技术上讲,它可以在返回值后被解除分配)。
我的代码中有两个部分没有按预期工作。
*注意:字段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*)(我想确保它没有被破坏或其他东西)。
我会很感激任何帮助。如果需要更多信息,请告诉我。