我遇到了一些与以下代码具有相同逻辑的代码的问题:
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>
int main() {
std::condition_variable myCV;
std::mutex myMutex;
std::unique_lock myLock(myMutex);
bool isRunning{ true };
std::jthread myThread([&isRunning, &myCV, &myLock]() {
while (isRunning) {
myCV.wait(myLock);
// do some work here
}
std::cout << "Exited from myThread while loop." << std::endl;
});
for (int i = 0; i < 100; i++) {
myCV.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(20));
std::cout << "Test loop " << i << std::endl;
}
isRunning = false;
myCV.notify_one();
return 0;
}
基本上,我有一个循环来做一些工作,当我的工作在每次迭代中完成时,我调用另一个线程中的一个方法来处理数据而不阻塞主线程;为了避免每次创建和销毁线程,我在该线程内使用带有
std::condition_variable
的循环,以便在数据准备好时开始管理数据。
逻辑运行良好,但退出程序时出现问题;如果我运行代码,程序结束时会出现错误,因为互斥体析构函数调用
abort()
:
...\stl\src\mutex.cpp(164): unlock of unowned mutex
如果我评论下一行
myCV.notify_one();
,程序将继续运行而不停止。
如何优雅地退出程序而不出现任何错误?我做错了什么?
感谢您的评论。事实上,问题在于互斥锁在与获取互斥锁的线程不同的线程中解锁。将锁定义移到线程代码内解决了问题:
#include <mutex>
#include <condition_variable>
#include <thread>
#include <iostream>
int main() {
std::condition_variable myCV;
std::mutex myMutex;
bool isRunning{ true };
std::jthread myThread([&isRunning, &myCV, &myMutex]() {
std::unique_lock myLock(myMutex);
while (isRunning) {
myCV.wait(myLock);
// do some work here
}
std::cout << "Exited from myThread while loop." << std::endl;
});
for (int i = 0; i < 100; i++) {
myCV.notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(20));
std::cout << "Test loop " << i << std::endl;
}
isRunning = false;
myCV.notify_one();
return 0;
}