condition_variable等待锁定

时间:2018-02-22 08:57:42

标签: c++ multithreading

我尝试将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已经解锁互斥锁时,为什么旋转锁失败?

2 个答案:

答案 0 :(得分:3)

运行时错误可能发生,因为在crt启动期间启动线程时某些其他全局变量未初始化。尝试在main函数中启动线程。不确定这是你的情况,因为理论上它应该在开始时崩溃。但无论如何,你的实施至少可能会崩溃。

你在旋转中有无限循环,因为它永久地落在“if(done)continue”语句中。在“if(done)continue”之前加上“if(stop)return”。

答案 1 :(得分:1)

发生运行时错误是因为在构建互斥锁和cv以及启动线程之间存在竞争条件。新线程启动并尝试在主线程完成构造之前使用互斥锁。