我在实现非抢占式调度时遇到了用于初始化TCB的代码。
typedef struct TCB_t {
struct TCB_t *next;
struct TCB_t *prev;
ucontext_t context;
} TCB_t;
void init_TCB (TCB_t *tcb, void *function, void *stackP, int stack_size)
{
memset(tcb, '\0', sizeof(TCB_t));
getcontext(&tcb->context);
tcb->context.uc_stack.ss_sp = stackP;
tcb->context.uc_stack.ss_size = (size_t) stack_size;
makecontext(&tcb->context, function, 0); // context is now cooked
}
我知道在上面的代码中获取上下文需要一个指向上下文的指针...但无法理解编译器如何解释&tcb->context
...
& tcb - >上下文或&(tcb - > context).....
答案 0 :(得分:3)
它被解释为&(tcp->context)
。 ->
的优先级高于&
。您可以找到运算符优先级列表here。
答案 1 :(得分:1)
getcontext(&tcb->context);
使用您已展示的代码中的线索,您可以推断出仅可以解释为&(tcb->context)
。
(&tcb)->context
没有任何意义。我们知道,在此函数中,参数声明为TCB_t *tcb
,这意味着(&tcb)
的类型为TCB_t **
。您只能在指向结构的指针上使用->
,而不能在双指针上使用。{/ p>
因此,必须将其解释为&(tcb->context)
。使用getcontext
的函数原型,您可以通过查看它需要ucontext_t *
参数来确认这一点,这是您获取&
的地址context
时所获得的参数1}} TCB_t
的成员。