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
相关产品推荐
相关产品推荐

