【问题标题】:I need to understand how &tcb -> context is interpreted by the compiler我需要了解编译器如何解释 &tcb -> context
【发布时间】:2015-05-12 15:41:02
【问题描述】:

我在实现非抢占式调度时遇到了这段用于初始化 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 -> 上下文).....

【问题讨论】:

标签: c multithreading operating-system scheduling


【解决方案1】:

它被解释为&(tcp->context)-> 的优先级高于 &。您可以找到运算符优先级列表here

【讨论】:

    【解决方案2】:
    getcontext(&tcb->context);
    

    使用您显示的代码中的线索,您可以推断它只能被解释为&(tcb->context)

    (&tcb)->context 没有任何意义。我们知道,在这个函数中,参数被声明为TCB_t *tcb,这意味着(&tcb)的类型是TCB_t **。您只能在指向结构的指针上使用->,而不能在双指针上使用。

    因此,它必须被解释为&(tcb->context)。使用getcontext 的函数原型,您可以确认这一点,通过看到它接受一个ucontext_t * 参数,当您获取contextcontext 成员的地址(&)时,您会得到这个参数。 @。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 2011-01-11
      • 2018-02-27
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      相关资源
      最近更新 更多