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线程不执行生产者-消费者问题的函数的主要内容,如果未能解决你的问题,请参考以下文章

一些提示,以避免在这个pthreaded C程序中出现死锁

waitpid 和 pthread_cond_wait(3)

生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

将 pthread_mutex_t 传递给函数

C++多线程怎么实现

Linux Posix线程条件变量