C pthreads线程不执行生产者-消费者问题的函数
Posted
技术标签:
【中文标题】C pthreads线程不执行生产者-消费者问题的函数【英文标题】:C pthreads threads not executing functions for producer-consumer problem 【发布时间】:2021-12-19 21:26:39 【问题描述】:您好,我正在尝试使用线程和信号量解决生产者消费者问题。
我有线程消费者和生产者将调用但它们没有执行的两个函数。我不确定我做错了什么,因为我没有收到任何错误,我的程序只是没有执行线程函数。我正在创建并加入线程,我不确定是什么导致了问题
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <semaphore.h>
#include <stdlib.h>
#include <errno.h>
#include "buffer.h"
struct bufferStruct *item; //calls buffer structure from buffer.h
pthread_mutex_t mutex; //lock for synchronizing execution of threads(producer and consumer)
sem_t empty; //indicates buffer is empty
sem_t full; //indicates buffer is full
int input = 0;
int newitem;
pthread_attr_t attr;
void *producer(void *param)
for(int i = 0; i < 5; i++)
sem_wait(&empty);
pthread_mutex_lock(&mutex);
newitem = rand();
item->content[item->in] = newitem;
printf("Producer prouced item %d at position %d in buffer\n", newitem, item->in);
item->in = (item->in+1) % MAX_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&full);
sleep(1);
void *consumer(void * param)
for(int i =0; i< 5; i++)
sem_wait(&full);
pthread_mutex_lock(&mutex);
newitem = item->content[item->out];
printf("Consumer has consumed item %d at position %d in buffer\n", newitem, item->out);
item->out = (item->out+1) % MAX_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
sleep(1);
int main()
int initval = 1;
int initval2 = 2;
sem_init(&full, 1, 0);
sem_init(&empty, 1, MAX_SIZE);
if(pthread_mutex_init(&mutex,NULL)!=0)
printf("Mutex init failed\n");
return 1;
pthread_attr_init(&attr);
pthread_t thread_produce, thread_consume;
printf("Starting threads...\n");
pthread_create(&thread_produce, &attr, producer, (void*)&(initval));
pthread_create(&thread_consume, &attr, consumer, (void*)&(initval2));
pthread_join(thread_produce, NULL);
pthread_join(thread_consume, NULL);
printf("Threads done executing...\n");
pthread_mutex_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
exit(0);
【问题讨论】:
MAX_SIZE
是什么?
【参考方案1】:
你声明
struct bufferStruct *item;
然后你使用item
而不指定它指向任何东西。未定义的行为结果。
如果我解决了这个问题(首先合成一个版本struct bufferStruct
并选择一个MAX_SIZE
)然后程序编译没有错误并且似乎运行成功。
【讨论】:
以上是关于C pthreads线程不执行生产者-消费者问题的函数的主要内容,如果未能解决你的问题,请参考以下文章
waitpid 和 pthread_cond_wait(3)