我设置了一个线程并阻塞了.
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)?有什么建议吗?
发布于 2015-10-25 05:50:36
是的,从协议线程外部调用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所做的。
https://stackoverflow.com/questions/32355717
复制相似问题