C语言pthread实现生产者消费者问题时线程函数未执行问题
生产者消费者代码故障排查与修复
核心故障原因
- 全局变量
struct bufferStruct *item是未初始化的野指针,没有分配内存空间,也没有初始化in、out成员。线程执行过程中访问item->content、item->in等操作会触发未定义行为,大概率直接挂死或异常退出,表面看起来就是线程没有执行。 - 线程执行函数
producer、consumer声明为返回void *类型,函数末尾缺失return语句,部分编译环境下会导致线程执行异常。 - 可选优化:
sem_init第二个参数pshared设为1代表信号量用于进程间共享,当前同进程多线程场景应该设为0,减少不必要的资源开销。 - 潜在风险:全局变量
newitem被两个线程同时读写没有加锁,会出现数据竞争,建议改为线程局部变量。 - 拼写错误:原有
producer函数里的打印语句把produced错写为prouced,可同步修正。
修复代码改动点
- 主函数初始化阶段先申请缓冲区内存并初始化成员
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; } // 其余原有代码不变
- 线程函数补充返回值,把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; // 补充线程函数返回值 }
- 程序退出前释放申请的内存,避免泄漏
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
相关产品推荐
相关产品推荐

