我正在为一个单线程微控制器编码,遇到了一个问题。如何停止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;
}
谢谢你的帮助!
2条答案
按热度按时间pcww981p1#
如果系统是单线程的,并且没有抢占式多任务处理,那么从外部就什么也做不了。这个系统,就其本质而言,只能做一件事:他目前正在做的事情。甚至没有办法 * 考虑 * 任务是否已经运行了太长时间,因为所有致力于“考虑”内容的元素都被有问题的任务使用。
如果没有操作系统级的抢占或某种类型的中断,就没有办法从该函数的外部停止某些操作。因此,该函数必须编写为基于某些条件停止 * 自身 *。
因此,您必须以这样一种方式编写
Foo::start
,它要么具有停止条件,要么被赋予一个函数指针,以定期调用,告诉它是否应该停止。vlf7wbxs2#
坦率地说,您试图将并发应用于单线程程序,这使它变得比必要的更复杂。单线程应用程序中只有一个线程。当你调用一个阻塞方法时,它将阻塞直到返回。调用者调用后无法解除阻止。从
while
循环返回的方法是中断循环:你可以通过callable注入条件: