条件变量与原子类型的同步

时间:2015-11-27 01:39:54

标签: c++ multithreading c++11 concurrency atomic

假设我使用条件变量同步生产者和消费者线程。

// Approach 1 - Using condition variable
mutex mmutex;
condition_variable mcond;
queue<string> mqueue;

void producer(){
    while (true) {
        unique_lock<mutex> lck(mmutex);
        mqueue.push_back("Hello Hi");
        mcond.notify_one();
    }
}

void consumer{
    while (true){
        unique_lock<mutex> lck(mmutex); // locks mmutex
        mcond.wait(); // releases mmutex;
        string s = mqueue.front(); // locks mmutex again
        mqueue.pop();
        mmutex.unlock();
    }
}

上述代码如何比较使用简单原子类型的同步,如下所示 -

// Approach 2 - using atomics
atomic_bool condition = false;
condition_variable mcond;
queue<string> mqueue;

void producer(){
    unique_lock<mutex> lck(mmutex);
    mqueue.push_back("Hello Hi");
    condition = true;
}

void consumer{
    while (1) {
        if (condition == true) {
            condition = false;
            unique_lock<mutex> lck(mmutex);
            mqueue.front();
            mqueue.pop();
            lck.unlock();
        }
    }
}

由于条件变量存在,我认为它们是在这些情况下实现同步的首选方法。如果确实如此,为什么条件变量是基于同步的简单atomic_bool(或atomic_int,如果你需要多于两个状态)的更好的替代方法?如果没有,那么在这种情况下实现同步的最佳方法是什么?

1 个答案:

答案 0 :(得分:7)

不同之处在于条件变量不会消耗CPU周期而另一个线程正在等待它。如果使用原子变量进行同步,则必须在循环中继续检查其值。