c++ 如何在单线程系统上停止阻塞任务?

ws51t4hk  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(179)

我正在为一个单线程微控制器编码,遇到了一个问题。如何停止Foo bar执行?
在我的控制器上不可能使用<thread><future>。命令bar.stop()不具有确定性。应将其用作随机用户输入。

class Foo{
  public:
    void start() {
      while(true) {
        if(m_stopped) { return; }
        //do something...
      }
    };

    void stop() {
      m_stopped = true;
    };

  private:
    bool m_stopped = false;
};

int main() {
  Foo bar;

  bar.start();
  bar.stop();

  return 0;
}

谢谢你的帮助!

pcww981p

pcww981p1#

如果系统是单线程的,并且没有抢占式多任务处理,那么从外部就什么也做不了。这个系统,就其本质而言,只能做一件事:他目前正在做的事情。甚至没有办法 * 考虑 * 任务是否已经运行了太长时间,因为所有致力于“考虑”内容的元素都被有问题的任务使用。
如果没有操作系统级的抢占或某种类型的中断,就没有办法从该函数的外部停止某些操作。因此,该函数必须编写为基于某些条件停止 * 自身 *。
因此,您必须以这样一种方式编写Foo::start,它要么具有停止条件,要么被赋予一个函数指针,以定期调用,告诉它是否应该停止。

using StopFunc = bool(*)(void*);

...

    void start(StopFunc stop_func, void* param) {
      while(true) {
        if(stop_func(param)) { return; }
        //do something...
      }
    };
vlf7wbxs

vlf7wbxs2#

坦率地说,您试图将并发应用于单线程程序,这使它变得比必要的更复杂。单线程应用程序中只有一个线程。当你调用一个阻塞方法时,它将阻塞直到返回。调用者调用后无法解除阻止。从while循环返回的方法是中断循环:

while(true) {
    if(some_condition) { return; }
    //do something...
  }

你可以通过callable注入条件:

template <typename F>
void doSomething(F stop_condition) {
  while(true) {
    if(stop_condition()) { return; }
    //do something...
  }
}

相关问题