这是一个经典的c/p问题,其中一些线程在其他线程读取数据时产生数据。生产者和消费者都共享一个常量大小的缓冲区。如果缓冲区为空,则消费者必须等待,如果缓冲区已满,则制片人必须等待。我正在使用信号量来跟踪全部或空的队列。制片人将减少免费斑点信号量,增加值,并增加填充槽信号量。所以我试图实现一个从生成器函数获取一些数字的程序,然后打印出数字的平均值。通过将此视为生产者 - 消费者问题,我试图节省执行该程序的一些时间。 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是不充分),而消费者从阅读队列(即如果q不为空)。我不确定要把主要内容放在什么位置。 也在“Thread.h”中,您可以创建一个线程,一个互斥量或一个信号量。该线程具有.run(threadFunc,arg),.join()等方法。可以锁定或解锁互斥锁。信号量方法已经全部用于我的代码中。
嗨丹,你没有接受任何给你的答案。请给社区一些答案以回答你的问题。 – 2012-02-22 14:03:32
我很抱歉,我甚至没有意识到这是一个选项,直到现在!我接受了我以前提出的所有问题的答案。 – 2012-02-22 14:09:31
非常感谢您的回复。然而,它并不是我所面临的代码,我只是不确定在哪里定义什么特别是与消费者。 – 2012-02-22 20:50:36