Protothreads 子线程返回执行结果的办法
Protothreads 支持层次化线程,可以在线程中调用并等待子线程,就像函数调用子函数一样。但是有个缺憾,函数返回值被 PT 占用作为线程状态,无法通过函数返回值返回子线程的执行结果,只能使用其它办法返回执行结果。
https://blog.csdn.net/zoomdy/article/details/90690506
zoomdy at 163 dot com
通过函数参数返回
函数参数传入指针,通过指针指向的变量返回
#include "pt.h"
PT_THREAD(top_thread(void))
{
static int retval;
......
PT_WAIT_THREAD(&pt, sub_thread(&retval, a, b, c));
if(retval != 0) {
......
}
......
}
PT_THREAD(sub_thread(int* retval, int a, int b, int c))
{
......
if(...) {
*retval = -EPIPE;
PT_EXIT(&pt);
}
......
PT_WAIT_THREAD(&pt, sub_sub_thread(retval, d, e));
if(*retval!= 0) {
......
PT_EXIT(&pt);
}
......
}
PT_THREAD(sub_sub_thread(int* retval, int d, int e))
{
......
if(...) {
*retval= -EIO;
PT_EXIT(&pt);
} else if(...) {
*retval= -ETIMEDOUT;
PT_EXIT(&pt);
} else {
*retval= result;
PT_EXIT(&pt);
}
......
}
- 只需要顶层线程定义静态的返回值
- 每次轮询都要传递返回值指针
通过静态变量返回
子线程定义返回值静态变量,返回前设置静态变量,上层线程检查静态变量来判断子线程的执行结果。
#include "pt.h"
int sub_retval;
int sub_sub_retval;
PT_THREAD(top_thread(void))
{
......
PT_WAIT_THREAD(&pt, sub_thread(a, b, c));
if(sub_retval != 0) {
......
}
......
}
PT_THREAD(sub_thread(int a, int b, int c))
{
......
if(...) {
sub_retval = -EPIPE;
PT_EXIT(&pt);
}
......
PT_WAIT_THREAD(&pt, sub_sub_thread(d, e));
if(sub_sub_retval != 0) {
......
sub_retval = sub_sub_retval;
PT_EXIT(&pt);
}
......
}
PT_THREAD(sub_sub_thread(int d, int e))
{
......
if(...) {
sub_sub_retval = -EIO;
PT_EXIT(&pt);
} else if(...) {
sub_sub_retval = -ETIMEDOUT;
PT_EXIT(&pt);
} else {
sub_sub_retval = result;
PT_EXIT(&pt);
}
......
}
- 每个子线程定义一个静态的返回值变量
- 轮询时不需要传递返回值指针
- 需要反复设置返回值(因为每个子线程一个返回值,子子线程的返回值要拷贝到子线程的返回值)
改造 Protothreads
目前的 PT 返回值是 char
类型,表示线程的状态,能不能把返回值类型更换成结构体,既包含线程状态又包含返回值呢?例如返回一个 struct {char state, int retval }
结构体。这个后续再研究一下。