我尝试将condition_variable与stl。
中的unique_lock一起使用但它在spin()函数上失败了。据我所知,这是一个互锁的问题。但我不明白为什么。
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
void spin();
bool stop = false;
bool done = false;
std::thread th(spin);
std::mutex mutex;
std::condition_variable cv;
void join()
{
{
std::unique_lock<std::mutex> lock(mutex);
stop = true;
}
cv.notify_one();
th.join();
}
void set_done()
{
{
std::unique_lock<std::mutex> lock(mutex);
std::cout << "setting done" << std::endl;
done = true;
}
cv.notify_one();
}
void spin()
{
while (true)
{
std::unique_lock<std::mutex> lock(mutex);
if (done)
{
std::cout << "done..." << std::endl;
continue;
}
if (stop)
{
return;
}
cv.wait(lock);
}
}
int main(int argc, char* argv[])
{
set_done();
join();
return 0;
}
上面的代码只是错误&#34;设置完成&#34;并因运行时错误而失败。
当set_done已经解锁互斥锁时,为什么旋转锁失败?
答案 0 :(得分:3)
运行时错误可能发生,因为在crt启动期间启动线程时某些其他全局变量未初始化。尝试在main函数中启动线程。不确定这是你的情况,因为理论上它应该在开始时崩溃。但无论如何,你的实施至少可能会崩溃。
你在旋转中有无限循环,因为它永久地落在“if(done)continue”语句中。在“if(done)continue”之前加上“if(stop)return”。
答案 1 :(得分:1)
发生运行时错误是因为在构建互斥锁和cv以及启动线程之间存在竞争条件。新线程启动并尝试在主线程完成构造之前使用互斥锁。