【发布时间】:2019-01-16 15:06:39
【问题描述】:
我有一些并行运行的循环,并且有以下几行:
std::unique_lock <std::mutex> lock(_condLoopMutex);
_condLoopCondition.wait(lock, [this]() { return _conditionReady || _condLoopStopped; });
_conditionReady = false;
// DO SOMETHING
布尔变量
_conditionReady
通过以下构造设置在并行线程中:
_conditionReady = true;
_condLoopCondition.notify_one();
但是,有时我的程序会冻结。似乎通知来自函数“等待”传递参数并检查“_conditionReady”变量。
为避免这种情况,我实施了以下操作:
while (_conditionReady && !_condLoopStopped)
{
_condLoopCondition.notify_one();
std::this_thread::sleep_for(std::chrono::microseconds(100));
}
这样它会一直通知直到
_conditionReady == false
表示等待结束。
这是解决此问题的唯一方法 - 重新通知直到等待结束?有没有其他常规的方法来处理这些问题?
【问题讨论】:
-
您应该在设置
_conditionReady变量时持有互斥锁。此外,sleep从来没有解决方案。 -
您也可以通过 std::atomic 进行同步。它可以大大简化你的代码。
标签: c++ parallel-processing stl