上面的代码 ,if (!isThreadRunning_) { lock.unlock(); return; }这段为什么要去掉
时间: 2024-02-14 13:29:09 浏览: 72
shm.rar_IPC_better
对于上面的代码,`if (!isThreadRunning_)` 这段代码应该保留,以确保在线程结束时正确地退出循环。
在原始的代码中,当 `isThreadRunning_` 为 false 时,会调用 `lock.unlock()` 来手动解锁互斥锁,并使用 `return` 语句提前退出函数。这样做是为了确保线程在结束时能够正确释放互斥锁。
然而,在修正的代码中,我们使用了条件谓词 `cvQueue.wait(lock, [this] { return !processParaQueue.IsEmpty(); });`,它在每次被唤醒后会重新检查队列是否为空。因此,只有当队列非空时,线程才会继续执行。而在队列为空且 `isThreadRunning_` 为 false 的情况下,线程会一直等待直到被其他线程唤醒。因此,不再需要手动解锁互斥锁和提前退出函数的逻辑。
修正后的代码如下:
```cpp
std::unique_lock<std::mutex> lock(mutexQueue);
while (processParaQueue.IsEmpty()) {
if (!isThreadRunning_) {
LCD_LOGGER_INFO("MonitorLCDAssistant Thread end");
return;
}
cvQueue.wait(lock, [this] { return !processParaQueue.IsEmpty(); });
}
```
这样,我们仍然保持了正确的线程同步和互斥访问,同时也简化了代码逻辑。
阅读全文