【发布时间】:2012-03-12 20:50:31
【问题描述】:
这是一个经典的 c/p 问题,其中一些线程产生数据,而其他线程读取数据。生产者和消费者都共享一个 const 大小的缓冲区。如果缓冲区为空,则消费者必须等待,如果缓冲区已满,则生产者必须等待。我正在使用信号量来跟踪已满或空的队列。生产者将减少空闲点信号量,增加值,并增加填充槽信号量。所以我试图实现一个程序,从生成器函数中获取一些数字,然后打印出这些数字的平均值。通过将此视为生产者 - 消费者问题,我试图在程序的执行中节省一些时间。 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() 等方法。可以锁定或解锁互斥体。我的代码中都使用了信号量方法。
【问题讨论】:
-
嗨,丹,您不接受任何给您的答案。请激励社区回答您的问题。
-
我很抱歉直到现在我才意识到这是一个选项!我接受了我之前提出的所有问题的答案。
-
非常感谢您的回复。然而,与其说是我苦苦挣扎的代码,我只是不确定在哪里定义什么,尤其是与消费者有关的内容。
-
在您发布的代码中,您有一个
threadfunc,它是生产者:只需将其重命名为producer并编写另一个名为consumer的函数。producer已经在推送它的产品,所以没关系 - 你只需要将它绑定到Thread producer以便它实际运行。如果您需要多个生产者,请在多个Thread对象中运行相同的函数。consumer函数需要pop在循环中进行计算。最后,您需要弄清楚生产者和消费者如何知道何时停止!
标签: c++ c concurrency mutex producer-consumer