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

循环创建线程的多写多读队列程序故障求助:后续写入线程未执行

多写入者线程仅第一个正常工作的问题排查

嘿,我来帮你捋捋这个多线程的问题!从你描述的现象和给出的代码片段来看,大概率是几个常见的多线程坑导致的,咱们一步步拆解:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:28:57