#include <iostream>
#include <thread>
#include <condition_variable>
#include <queue>
#include <cstdlib>
#include <chrono>
#include <ctime>
#include <random>
using namespace std;
//counts every number that is added to the queue
static long long producer_count = 0;
//counts every number that is taken out of the queue
static long long consumer_count = 0;
void generateNumbers(queue<int> & numbers, condition_variable & cv, mutex & m, bool & workdone){
while(!workdone) {
unique_lock<std::mutex> lk(m);
int rndNum = rand() % 100;
numbers.push(rndNum);
producer_count++;
cv.notify_one();
}
}
void work(queue<int> & numbers, condition_variable & cv, mutex & m, bool & workdone) {
while(!workdone) {
unique_lock<std::mutex> lk(m);
cv.wait(lk);
cout << numbers.front() << endl;
numbers.pop();
consumer_count++;
}
}
int main() {
condition_variable cv;
mutex m;
bool workdone = false;
queue<int> numbers;
//start threads
thread producer(generateNumbers, ref(numbers), ref(cv), ref(m), ref(workdone));
thread consumer(work, ref(numbers), ref(cv), ref(m), ref(workdone));
//wait for 3 seconds, then join the threads
this_thread::sleep_for(std::chrono::seconds(3));
workdone = true;
producer.join();
consumer.join();
//output the counters
cout << producer_count << endl;
cout << consumer_count << endl;
return 0;
}
Привет всем, я пытался реализовать производитель-потребитель-шаблон с C++. Производственная нить генерирует случайные целые числа, добавляет их в очередь и затем уведомляет потребительский поток о добавлении нового номера.C++ - Многопоточность - Связь между потоками
Потребительский поток ожидает уведомления, а затем печатает первый элемент очереди на консоли и удаляет его.
Я увеличил счетчик для каждого числа, которое добавлено в очередь, и другого счетчика для каждого числа, которое выведено из очереди.
Я ожидал, что два счетчика будут иметь одинаковое значение после завершения программы, однако разница огромна. Счетчик, который представляет дополнение к очереди, всегда находится в миллионном диапазоне (3871876 в моем последнем тесте), а счетчик, представляющий потребитель, который принимает числа из очереди, всегда ниже 100 000 (89993 в моем последнем тесте).
Может кто-нибудь объяснить мне, почему существует такая огромная разница? Должен ли я добавить другую переменную условия, чтобы потоки производителей также ожидали поток потребителей? Спасибо!
Может быть, что производитель немного быстрее, чем потребитель, а разница вызвано 'числами', имеющими именно элементы' manufacturer_count - consumer_count' в нем после присоединения потоков? В 'std :: cout << numbers.front() << std :: endl;' много работы, особенно потому, что вы ненужно (?) Очищаете вывод для каждого числа. – nwp
Не должно 'workdone' быть' atom 'или такой? –
Hurkyl
Существует условие гонки между производителем и потребителем. Просто случается, что производитель чаще приобретает блокировку, чем потребитель. – freakish