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

C语言pthread条件变量相关代码运行无输出问题求助

代码问题排查

你遇到的无输出问题是多个原因共同导致的,具体如下:

1. 主进程提前退出

你注释了pthread_join调用,main函数创建完两个子线程后会直接执行return 0,操作系统会直接终止整个进程的所有线程,子线程根本没有获得调度执行的机会,自然不会产生任何输出。
你可以暂时只保留对第二个线程的join调用即可,因为第一个线程是死循环逻辑,join它会导致程序永久阻塞:

pthread_join(two, NULL);

2. stdio缓冲区未刷新

你两个线程入口的printf语句都没有加换行符\n,默认情况下stdout是行缓冲模式,只有缓冲区满、遇到换行符、或者手动调用fflush(stdout)的时候才会把缓冲区内容输出到屏幕。就算线程获得了短暂的执行时间,打印的内容也会留在缓冲区内,进程退出后不会被输出。
修改打印语句加上换行即可解决该问题:

printf("In func one.\n");
printf("In func two.\n");

3. 触发条件概率极低

rand()返回的数值范围是0 ~ RAND_MAX,主流平台下RAND_MAX通常为2^31-1,随机生成刚好等于10的概率极低,就算你解决了前面两个问题,也大概率需要等待非常久才能看到thread_two的输出。
你可以先把判断条件改成更易触发的,比如x % 1000 == 0,或者直接固定给x赋值10测试条件变量逻辑是否正常。

额外优化点

  • volatile修饰x没有必要:所有对x的读写都在互斥锁的保护下,mutex本身已经保证了线程间的内存可见性,不需要额外加volatile。
  • 递归互斥锁这里没必要使用:你的逻辑里没有同一线程多次加锁的场景,用默认的普通互斥锁即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:15:00