You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言pthread实现生产者消费者问题时线程函数未执行问题

生产者消费者代码故障排查与修复

核心故障原因

  • 全局变量 struct bufferStruct *item 是未初始化的野指针,没有分配内存空间,也没有初始化 in、out 成员。线程执行过程中访问 item->content、item->in 等操作会触发未定义行为,大概率直接挂死或异常退出,表面看起来就是线程没有执行。
  • 线程执行函数 producer、consumer 声明为返回 void * 类型,函数末尾缺失return语句,部分编译环境下会导致线程执行异常。
  • 可选优化:sem_init 第二个参数pshared设为1代表信号量用于进程间共享,当前同进程多线程场景应该设为0,减少不必要的资源开销。
  • 潜在风险:全局变量newitem被两个线程同时读写没有加锁,会出现数据竞争,建议改为线程局部变量。
  • 拼写错误:原有producer函数里的打印语句把produced错写为prouced,可同步修正。

修复代码改动点

  1. 主函数初始化阶段先申请缓冲区内存并初始化成员
int main()
{
   // 新增缓冲区初始化代码
   item = malloc(sizeof(struct bufferStruct));
   item->in = 0;
   item->out = 0;

   int initval = 1;
   int initval2 = 2;
   // 修改sem_init的pshared参数为0
   sem_init(&full, 0, 0);
   sem_init(&empty, 0, MAX_SIZE);
   if(pthread_mutex_init(&mutex,NULL)!=0){
       printf("Mutex init failed\n");
       return 1;
   }
   // 其余原有代码不变
  1. 线程函数补充返回值,把newitem改为局部变量
void *producer(void *param)
{
    int newitem; // 改为局部变量避免多线程竞争
    for(int i = 0; i < 5; i++)
    {
        sem_wait(&empty);
        pthread_mutex_lock(&mutex);
        newitem = rand();
        item->content[item->in] = newitem;
        printf("Producer produced 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);
    }
    return NULL; // 补充线程函数返回值
}

void *consumer(void * param)
{
    int newitem; // 改为局部变量避免多线程竞争
    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);
    }
    return NULL; // 补充线程函数返回值
}
  1. 程序退出前释放申请的内存,避免泄漏
pthread_join(thread_consume, NULL);
   printf("Threads done executing...\n");
   pthread_mutex_destroy(&mutex);
   sem_destroy(&empty);
   sem_destroy(&full);
   free(item); // 新增释放缓冲区内存
   exit(0);

内容的提问来源于stack exchange,提问作者HotWheels

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:15:01