我设置了一个原型(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/