【发布时间】:2019-09-20 01:42:41
【问题描述】:
我有 10 个消费者线程和 1 个生产者线程。生产者线程产生一个随机整数并将其插入缓冲区。消费者线程从这个缓冲区中取出一个项目并打印它。
一切都很好(我在,没有无限循环或阻塞的东西)。但我认为,只有一个工作的消费者线程是第 10 个(最后一个)消费者线程。其他 9 个消费者线程不起作用。我意识到当我在消费者线程方法中打印消费者 ID 时。为什么其他 9 个消费者线程都不起作用,遇到这种问题该怎么办?
下面是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
typedef int buffer_item;
#define BUFFER_SIZE 5
#define RAND_DIVISOR 100000000
#define TRUE 1
pthread_mutex_t mutex;
sem_t full, empty;
buffer_item buffer[BUFFER_SIZE];
int counter;
pthread_t tid;
pthread_attr_t attr;
void *producer(void *param);
void *consumer(void *param);
int insert_item(buffer_item item) {
if(counter < BUFFER_SIZE) {
buffer[counter] = item;
counter++;
return 0;
}
else {
return -1;
}
}
int remove_item(buffer_item *item) {
if(counter > 0) {
*item = buffer[(counter-1)];
counter--;
return 0;
}
else {
return -1;
}
}
void initializeData() {
pthread_mutex_init(&mutex, NULL);
sem_init(&full, 0, 0);
sem_init(&empty, 0, BUFFER_SIZE);
pthread_attr_init(&attr);
counter = 0;
}
void *producer(void *param) {
buffer_item item;
while(TRUE) {
int rNum = rand() / RAND_DIVISOR;
sleep(1);
item = rand()%100;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
if(insert_item(item)) {
fprintf(stderr, " Producer report error condition\n");
}
else {
printf("producer produced %d\n", item);
}
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *consumer(void *param) {
buffer_item item;
int* consumerID=(int*)param;
while(TRUE) {
int rNum = rand() / RAND_DIVISOR;
sleep(1);
sem_wait(&full);
pthread_mutex_lock(&mutex);
if(remove_item(&item)) {
fprintf(stderr, "Consumer report error condition\n");
}
else {
printf("consumer %d consumed %d\n" ,*consumerID, item);
}
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}
int main(int argc, char *argv[]) {
/* Loop counter */
int i;
int numProd = 1; /* Number of producer threads */
int numCons = 10; /* Number of consumer threads */
/* Initialize the app */
initializeData();
/* Create the producer threads */
for(i = 0; i < numProd; i++) {
/* Create the thread */
pthread_create(&tid,&attr,producer,NULL);
}
/* Create the consumer threads */
for(i = 0; i < numCons; i++) {
/* Create the thread */
pthread_create(&tid,&attr,consumer,(void*)&i);
}
/* Sleep for the specified amount of time in milliseconds */
sleep(10);
/* Exit the program */
printf("Exit the program\n");
exit(0);
}
我的输出是:
producer produced 27
consumer 10 consumed 27
producer produced 63
consumer 10 consumed 63
producer produced 26
consumer 10 consumed 26
producer produced 11
consumer 10 consumed 11
producer produced 29
consumer 10 consumed 29
producer produced 62
consumer 10 consumed 62
producer produced 35
consumer 10 consumed 35
producer produced 22
consumer 10 consumed 22
producer produced 67
consumer 10 consumed 67
Exit the program
【问题讨论】:
-
你真的使用了很多cmets。没有一个 cmets 增加任何价值。请记住,“注释良好的代码”并不意味着 cmets 的数量。
-
sem_wait(&full)%100;的目的是什么? %100 无效。如果还没有,您应该尝试使用 -Wall 进行编译 -
@Shawn 对不起,我编辑了。
-
@Broman 我编辑了代码,抱歉。
-
这也是为了你自己。它在屏幕上占据的位置更多,编写时间更长,并且使代码更难维护。
标签: c multithreading pthreads producer-consumer