Прототить прыгнуть нить в начало во внешней главной функции

У меня есть прототип, настроенный и блокирующий...

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 делает.

Другие вопросы по тегам