我在根据布尔标志的值启动和停止后台线程时遇到了问题。我曾寻求帮助here并得到了非常详细的答案here。
然而,在使用该解决方案几天后,在我看来它有问题。我在SomeObject::DoRun
中调用的SomeObject::Start
中启动了一个工作线程,它应该在循环中完成一些工作并在我调用SomeObject::Stop
时退出:
struct SomeObject {
SomeObject() { SetDone(true); }
std::atomic_bool done_;
void DoRun();
void SetDone(bool v) { done_store(v); }
bool IsDone() { return done_.load(); }
void Start() {
if (IsDone()) {
SetDone(false);
DoRun();
}
void Stop() { SetDone(true); }
};
但是,有时IsDone()
Start()
中的false
检查会返回DoRun()
而done
永远不会被调用,即使我已将true
设置为{ {1}}在构造函数中。
我在构造函数中将done_
设置为true
然后在false
中将其设置为Start()
的原因是我要调用Start()
/ {{ 1}}重复对同一个对象。
我在这里做错了什么?