【发布时间】:2019-04-11 10:53:50
【问题描述】:
如何确保 Producer 和 Consumer 函数一个接一个地无限运行?例如:首先,我希望用户输入数组,然后消费者函数打印输入的数组,然后再次要求用户输入数组。
/* Headers */
pthread_mutex_t mutex;
pthread_cond_t cond,cond1;
void *producer(void *arg);
void *consumer(void *arg);
static int n;
int consumerFlag[100];
void *producer(void *arg)
{
pthread_mutex_lock(&mutex);
while(1)
{
printf("\n Enter no of terms");
scanf("%d",&n);
int i;
printf("\n Enter consumer flag array");
for (i = 0; i < n; i++)
{
scanf(" %d",&consumerFlag[i]);
pthread_mutex_unlock(&mutex);
}
pthread_cond_signal(&cond);
usleep(1000);
}
}
void *consumer(void *arg)
{
int i;
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
printf("\nConsumer Function");
while(1)
{
printf("\nConsumer thread waiting");
for (i = 0; i < n; i++)
{
printf("\nConsumerFlag %d = %d", i, consumerFlag[i]);
pthread_mutex_unlock(&mutex);
}
}
}
int main()
{
int i=0;
pthread_mutex_init(&mutex,0);
pthread_cond_init(&cond,0);
pthread_t pThread, cThread;
pthread_create(&pThread, 0, producer, 0);
pthread_create(&cThread, 0, consumer,0);
pthread_join(pThread,NULL);
pthread_join(cThread, NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
首先,我希望用户输入数组,然后消费者函数打印输入的数组,然后再次要求用户输入数组。
【问题讨论】:
-
使用两个条件标志,一个用于生产者向消费者发出信号,告诉消费者它有工作要消费,另一个用于向生产者发出信号,告诉生产者它已准备好进行更多工作。
-
您有一个电话给
pthread_mutex_lock,多个电话给pthread_mutex_unlock。正确使用它们: loc 访问公共资源,解锁以允许其他人访问 -
需要澄清一点:您是否希望生产者在消费者开始消费之前生产完整的阵列?还是您希望生产者和消费者并行处理不同的数组索引?
-
我希望生产者在消费者开始消费之前生产整个数组。 @MayurK
-
@DevanshuTripathi:好的。那么你就不需要consumerFlag[100]。只有一个消费者标志和一个生产者标志就足够了。但是,您需要使用两个条件变量 - 生产者和消费者各一个。