Сложность с unique_lock в простом Producer & amp; потребитель

Я написал очень простой Producer / Consumer на основе заметок C ++ 11 и не смог понять, почему unique_lock () не снимает блокировку, когда выходит из области видимости.

struct Message{
Message(int x):data(x){cout<<"+";}
int data;
};queue<Message*> g_queue;
condition_variable cv;
mutex m;

void consumer()
{
do {
unique_lock<mutex> lck {m};
cv.wait(lck, [&](){return !g_queue.empty();});
cout<<"Notified...";
auto& obj = g_queue.front();
std::cout<<obj->data;
g_queue.pop();
cout<<".";
lck.unlock(); -----(1)
} while(1);

}

void producer()
{
while(true){
unique_lock<mutex> lck {m};
Message msg{5};
cout<<"Queue size:"<<g_queue.size()<<'\n';
g_queue.push(&msg);
cv.notify_one();
lck.unlock(); -------(2)
cout<<"-"<<'\n';
this_thread::sleep_for(std::chrono::milliseconds{2000});
}
}

И использовать его как: —

    thread Q(&consumer);
thread P(&producer);
P.join();
Q.join();

Выход:

+Queue size:0
-Notified...
5.+Queue size:0
-Notified...5
.+Queue size:0
-Notified...5

Технически, да, производитель должен сообщить потребителю, что я готов, и потребитель должен дать знать производителю, чтобы он отправил больше данных. Я не ясно, что использовать, переменная условия делает это или unique_lock делает это.

Точно, почему мне нужно (1) и (2), когда область может освободить замки

== Редактирование ==
Ниже приведен отредактированный код, который работает нормально,

void consumer()
{
do {
unique_lock<mutex> lck {m};
cv.wait(lck, [&](){return !g_queue.empty();});
cout<<"Notified...";
auto& obj = g_queue.front();
std::cout<<obj->data;
g_queue.pop();
cout<<".";
} while(1);

}

Message msg{5};
void producer()
{
while(true){
unique_lock<mutex> lck {m};
cout<<"Queue size:"<<g_queue.size()<<'\n';
g_queue.push(&msg);
cv.notify_one();
cout<<"-"<<'\n';
}
}

Теперь, как я могу ввести небольшой газ, если я хочу в Producer или Consumer, если сон рискован?

-1

Решение

Не уверен, что здесь все еще есть вопрос, но одно решение для регулирования состоит в том, чтобы иметь максимальный размер, до которого разрешено наращивание очереди в производителе. Когда очередь достигает этого размера, производитель ожидает другую переменную условия. Потребитель сообщает эту вторую переменную условия, когда очередь опускается ниже определенного размера. (Последний размер, возможно, несколько меньше максимума, чтобы дать некоторый гистерезис.) Предикат для ожидания этой новой переменной условия g_queue.size() >= max_size,

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]