首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >protothread在外部main函数中将线程跳到开头

protothread在外部main函数中将线程跳到开头
EN

Stack Overflow用户
提问于 2015-09-02 22:20:32
回答 1查看 86关注 0票数 2

我设置了一个线程并阻塞了.

代码语言:javascript
复制
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)?有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2015-10-25 05:50:36

是的,从协议线程外部调用PT_INIT会重新启动它。如果你看一下PT_RESTART的源代码

代码语言:javascript
复制
#define PT_RESTART(pt)              \
  do {                      \
    PT_INIT(pt);                \
    return PT_WAITING;          \
  } while(0)

这就是它所做的,但随后也会从线程中返回(类似于yield)。正如您所说,它被设计为从协议线程内部调用。

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

代码语言:javascript
复制
struct pt {
  lc_t lc; // where lc_t is an unsigned short;
};

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32355717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档