0

所以,我对这个问题困惑了一个多小时。

背景:

我在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*)(我想确保它没有被破坏或其他东西)。

我会很感激任何帮助。如果需要更多信息,请告诉我。

4

1 回答 1

0

如果我没看错,你可以通过这个字段“返回”这个值:

proc->has_waiting->ret_val

但是您通过此字段引用它:

proc->ret_val

您应该在两个地方使用相同的参考。

编辑:如何简化这个并制作ret_val一个char *

于 2013-05-08T21:30:48.627 回答