gpt4 book ai didi

c++ - 用于同步的条件变量与原子类型

转载 作者:搜寻专家 更新时间:2023-10-30 23:55:02 24 4
gpt4 key购买 nike

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

// 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,如果你需要更多的两个状态)的同步的更好替代方案?如果不是,那么在这种情况下实现同步的最佳方法是什么?

最佳答案

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

关于c++ - 用于同步的条件变量与原子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33949193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com