Предположим, что у меня есть потоки производителей и потребителей, синхронизированные с использованием переменной условия.Переменные условий для атомных типов для синхронизации
// 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, если вам нужно больше двух состояний)? Если нет, то каков наилучший способ добиться синхронизации в этом случае?
'wait' необходимо вызвать с помощью замка. И вам нужно справиться с побочным пробуждением. –
@ T.C. Вы уверены, что ожидание должно быть вызвано с блокировкой в потребителе? Я был скопирован код из Tour of C++ by Bjarne Stroustrup. –
Вы знаете, что ни одно из ваших решений не работает, если производитель быстрее, чем потребитель? Решение переменной условия также не обрабатывает ложные пробуждения. – Voo