Условная переменная 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;
  }

0 ответов

Другие вопросы по тегам