потребитель / производитель в c ++

Это классическая проблема c / p, когда некоторые потоки производят данные, а другие читают данные. Как производитель, так и потребители используют общий размер буфера. Если буфер пуст, то потребители должны ждать, а если он заполнен, то производитель должен ждать. Я использую семафоры для отслеживания полных или пустых очередей. Производитель собирается уменьшить семафор свободных пятен, добавить значение и увеличить семафор заполненных слотов. Поэтому я пытаюсь реализовать программу, которая получает некоторые числа из функции генератора, а затем выводит среднее число. Рассматривая это как проблему производителя-потребителя, я пытаюсь сэкономить некоторое время при выполнении программы. Функция generateNumber вызывает некоторую задержку в процессе, поэтому я хочу создать ряд потоков, которые генерируют числа, и поместить их в очередь. Затем «главный поток», который выполняет основную функцию, должен прочитать из очереди и найти сумму, а затем усреднить. Итак, вот что я имею:

#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 не заполнено), пока потребитель читает из очереди (то есть, если q не пусто). Я не уверен, что поставить в главном, чтобы это произошло. также в «Thread.h» вы можете создать поток, мьютекс или семафор. Поток имеет методы .run (threadFunc, arg), .join () и т. Д. Мьютекс может быть заблокирован или разблокирован. Все методы семафора были использованы в моем коде.

Ответы на вопрос(4)

Ваш ответ на вопрос