我在实现非抢占式调度时遇到了初始化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
}我知道上面代码中的get context带有一个指向context...but的指针,无法理解compiler...as &tcb -> context或&(tcb -> context)如何解释&tcb->context .....
发布于 2015-03-11 12:03:03
它被解释为&(tcp->context)。->比&具有更高的优先级。您可以找到运算符优先级列表here。
发布于 2015-03-11 12:19:01
getcontext(&tcb->context);使用您所展示的代码中的线索,您可以推断它只能被解释为&(tcb->context)。
(&tcb)->context不会有任何意义。我们知道,在这个函数中,参数被声明为TCB_t *tcb,这意味着(&tcb)是TCB_t **类型。只能在指向结构的指针上使用->,而不能在双指针上使用。
因此,必须将其解释为&(tcb->context)。使用getcontext的函数原型,您可以通过查看它接受一个ucontext_t *参数来确认这一点,该参数是您获取TCB_t的context成员(&)的地址时获得的参数。
https://stackoverflow.com/questions/28976638
复制相似问题