Это классическая проблема 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 () и т. Д. Мьютекс может быть заблокирован или разблокирован.Все методы семафора были использованы в моем коде.