Это классическая проблема c/p, когда некоторые потоки создают данные, а другие - данные. Как производитель, так и потребители используют буфер размером в const. Если буфер пуст, потребители должны ждать, и если он заполнен, то продюсер должен ждать. Я использую семафоры, чтобы отслеживать полные или пустые очереди. Производитель собирается уменьшать семафор свободных пятен, добавлять значения и сгенерировать заполненные слоты семафором. Поэтому я пытаюсь реализовать программу, которая получает некоторые числа из функции генератора, а затем выводит среднее число чисел. Рассматривая это как проблему производителя-потребителя, я пытаюсь сэкономить время на выполнение программы. Функция generateNumber вызывает некоторую задержку в процессе, поэтому я хочу создать несколько потоков, которые генерируют числа, и помещать их в очередь. Затем «основной поток», который выполняет основную функцию, должен читать из очереди и находить сумму, а затем среднюю. Так вот, что я до сих пор:потребитель/производитель в C++
#include <cstdio>
#include <cstdlib>
#include <time.h>
#include "Thread.h"
#include <queue>
int generateNumber() {
int delayms = rand()/(float) RAND_MAX * 400.f + 200;
int result = rand()/(float) RAND_MAX * 20;
struct timespec ts;
ts.tv_sec = 0;
ts.tv_nsec = delayms * 1000000;
nanosleep(&ts, NULL);
return result; }
struct threadarg {
Semaphore filled(0);
Semaphore empty(n);
std::queue<int> q; };
void* threadfunc(void *arg) {
threadarg *targp = (threadarg *) arg;
threadarg &targ = *targp;
while (targ.empty.value() != 0) {
int val = generateNumber();
targ.empty.dec();
q.push_back(val);
targ.filled.inc(); }
}
int main(int argc, char **argv) {
Thread consumer, producer;
// read the command line arguments
if (argc != 2) {
printf("usage: %s [nums to average]\n", argv[0]);
exit(1); }
int n = atoi(argv[1]);
// Seed random number generator
srand(time(NULL));
}
Я немного запутался сейчас, потому что я не знаю, как создать несколько потоков производителей, которые генерируют число (если д не полностью), а потребитель читает из очередь (то есть, если q не пусто). Я не уверен, что добавить в основной смысл. также в разделе «Thread.h» вы можете создать поток, мьютекс или семафор. В потоке есть методы .run (threadFunc, arg), .join() и т. Д. Мьютекс можно заблокировать или разблокировать. Семафорные методы были использованы в моем коде.
Привет, Дэн, вы не приняли ни одного из ответов, которые были даны вам. Просьба дать некоторый стимул сообществу ответить на ваши вопросы. –
Мне очень жаль, что я даже не догадывался, что это вариант до сих пор! Я принял ответы на все вопросы, которые я ранее задавал. –
Так спасибо за ответы. Тем не менее, это не столько код, с которым я борюсь, я просто не уверен, где определить, что особенно с потребителями. –