Условная переменная notify_one notify_all

Я пытаюсь изучить условные переменные, и я застрял в следующем примере. я думал так notify_one На потребителях следует разблокировать только одного ожидающего потребителя. Но после повторного запуска мне кажется, что это не так. Я изменился notify_one в notify_all и не заметил изменения в поведении. После звонков продюсера notify_one на потребителей я вижу Get… быть написанным на экране более чем одним потребителем.

Почему это происходит?

#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#include <chrono>
std::mutex mtx;
std::condition_variable produce,consume;

int cargo = 0;     // shared value by producers and consumers

void consumer () {
std::unique_lock<std::mutex> lck(mtx);
while (cargo==0) consume.wait(lck);
std::cout << "Get" << cargo << " "<< std::this_thread::get_id() << '\n';
cargo--;
produce.notify_one();
}

void producer (int id) {
std::unique_lock<std::mutex> lck(mtx);
while (cargo!=0) produce.wait(lck);
std::cout << "Push" << id <<  " "<< std::this_thread::get_id() << '\n';
cargo += id;
consume.notify_one();
}

void c () {
while(1) {
consumer();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}
void p(int n) {
while(1) {
producer(n);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
}

int main ()
{
std::thread consumers[5],producers[5];

for (int i=0; i<5; ++i) {
consumers[i] = std::thread(c);
producers[i] = std::thread(p,i+1);
}

for (int i=0; i<5; ++i) {
producers[i].join();
consumers[i].join();
}

return 0;
}

1

Решение

Задача ещё не решена.

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


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