Прототить прыгнуть нить в начало во внешней главной функции
У меня есть прототип, настроенный и блокирующий...
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)
снова? Какие-либо предложения?
1 ответ
Да звоню PT_INIT
снаружи протопоток перезапустит его. Если вы посмотрите на источник для PT_RESTART
:
#define PT_RESTART(pt) \
do { \
PT_INIT(pt); \
return PT_WAITING; \
} while(0)
Это именно то, что он делает, но затем также возвращает (как выход) из потока. Как вы говорите, он предназначен для вызова из протопотока.
Структура protothread - это просто число, представляющее, где оно было в потоке:
struct pt {
lc_t lc; // where lc_t is an unsigned short;
};
Таким образом, единственное, что нам нужно сделать, это сбросить это число на ноль, что именно PT_INIT
делает.