2

我有一个原型线程设置和阻塞......

static int mythread(struct pt *pt){
  static int k;
  PT_BEGIN(pt)
  while(1){
     PT_WAIT_UNTIL(pt, eventA == 1);  // blocked at lineA

     for(k=0;k<100;k++){
        //do something
        PT_YIELD(pt);   //blocked at lineB
     }

     PT_WAIT_UNTIL(pt, eventB == 1);  //block at lineC
  }
  PT_END(pt)
}

一段时间后,mythread可以在“lineA”、“lineB”或“lineC”处被阻塞。

一个外部函数,比如main()重置,怎么会mythread在开头的“lineA”处再次被阻塞。

通过运行宏PT_RESTART(&pt_mythread)?编译器不喜欢它。因为我的main()函数不在 PT_BEGIN, PT_END 块内,所以return那个宏的内部是坏的,坏的。

还是又跑PT_INIT(&pt_mythread)了?有什么建议么?

4

1 回答 1

2

是的,PT_INIT从 protothread 外部调用将重新启动它。如果您查看以下来源PT_RESTART

#define PT_RESTART(pt)              \
  do {                      \
    PT_INIT(pt);                \
    return PT_WAITING;          \
  } while(0)

这正是它所做的,但随后也会从线程中返回(如产量)。正如您所说,它被设计为从原型线程内部调用。

protothread 结构基本上只是一个数字,表示它在线程中的位置:

struct pt {
  lc_t lc; // where lc_t is an unsigned short;
};

所以我们唯一需要做的就是将该数字重置为零,这正是这样PT_INIT做的。

于 2015-10-24T21:50:35.687 回答