protothread 将线程跳转到外部 main 函数的开头

标签 protothread

我设置了一个原型(prototype)线程并阻塞...

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 block 内,所以该宏内的 return 非常糟糕。

或者再次运行PT_INIT(&pt_mythread)?有什么建议吗?

最佳答案

是的,从原始线程外部调用PT_INIT将重新启动它。如果您查看 PT_RESTART 的源代码:

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

这正是它所做的,但也会从线程中返回(就像yield)。正如您所说,它被设计为从原始线程内部调用。

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

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

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

关于protothread 将线程跳转到外部 main 函数的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32355717/

相关文章: