循环创建线程的多写多读队列程序故障求助:后续写入线程未执行
多写入者线程仅第一个正常工作的问题排查
嘿,我来帮你捋捋这个多线程的问题!从你描述的现象和给出的代码片段来看,大概率是几个常见的多线程坑导致的,咱们一步步拆解:
1. 主线程提前退出,没等待子线程完成
你只贴了创建线程的循环,但没看到后续的线程等待逻辑。如果主线程创建完所有写入者线程后直接结束了,操作系统会终止整个进程下的所有子线程——这就会出现第一个线程刚好跑完,后面的线程还没来得及执行就被干掉的情况。
解决方法很简单,在创建完所有线程后,用pthread_join逐个等待每个写入者线程执行完毕:
// 创建完所有写入者线程后添加这段代码 for(i = 0; i < wno; i++) { pthread_join(writter[i], NULL); }
2. 队列锁未正确释放,导致后续线程阻塞
你提到每个写入者需要获取队列锁,如果第一个写入者拿到锁后忘记释放,后面的写入者会一直阻塞在锁的等待上,看起来就像线程函数没被调用。赶紧检查你的write_to_queue函数:
- 操作完队列后,是不是调用了
pthread_mutex_unlock(假设用的是互斥锁)? - 锁本身有没有正确初始化?比如是不是没调用
pthread_mutex_init就直接使用了?
3. 线程函数无参数,难以排查执行情况
你创建线程时给write_to_queue传的是NULL,这会导致你无法区分不同写入者线程的执行状态。建议给每个线程传入唯一的标识(比如线程的索引),这样能通过日志确认线程是否真的被调用:
// 修改线程创建代码,传入当前索引作为参数 ret = pthread_create(&writter[i], NULL, write_to_queue, (void*)i); // 线程函数里转换并使用参数 void* write_to_queue(void* arg) { int thread_idx = (int)arg; printf("写入者线程%d开始执行\n", thread_idx); // 你的队列写入逻辑... }
4. 多余的fflush(stdin)可能干扰程序
你在创建线程前调用了fflush(stdin),这是标准C未定义的行为——fflush只对输出流有效,对输入流调用它会导致不可预测的问题。直接删掉这行代码就好,它在这里完全没必要。
5. 线程数组的内存问题
检查writter数组的大小是不是足够容纳wno个pthread_t类型的元素?如果数组开小了,会出现内存越界,破坏程序的其他变量,进而导致线程创建失败或者异常。
先从这几个点排查,尤其是主线程等待和锁释放的问题,这是多线程程序里最容易踩的坑!
内容的提问来源于stack exchange,提问作者Ankit Negi
相关产品推荐
相关产品推荐

