PS:今天做项目的时候,开多线程测试,遇到了一个奇怪的问题,到现在都没有办法解释~
多线程在Debug版本下的cout部分会正常输出
多线程在Release版本下的cout部分似乎受到了阻塞
1 | //开了四个线程 |
Release版本的代码改为以下形式,while里加cout,所有cout部分就都能正常输出
1 | //开了四个线程 |
很服气,到底cout、while、Release是什么关系
更新问题:
哇,真的超级崇拜我家Uncle D,晚上他试了几次,就找到问题所在,其实是 Release优化的问题
(1)首先,这个和cout无关,之前觉得是cout多线程缓存区刷新的问题,后来发现不论将后面的代码改为printf还是文件输出都没有反应
(2)其次,这个问题和Release优化相关,将VS项目属性里C/C++下的优化改为禁用,while后面部分就能正常执行
(3)接着,解释为什么while后面的代码不执行,因为编译器觉得当前线程中times只加1次,所以times不能加到4,while是个死循环,所以while后的代码不执行
(4)最后,解释为什么在while的循环体内使用cin、cout、printf这些输入输出流,就能跨过while,因为输入输出能够 触发中断,这个时候while循环就不会被优化掉
最后的最后,他说是我程序写的有问题,因为我将times定义为全局,在每个线程结束处进行times++,编译器会觉得times加不到4,用 for和 pthread_join()
等待线程结束,不用while去等待所有线程结束
怎么办,现在越来越崇拜Uncle D了,无法自拔的痴迷 ~
现在发展到,他在旁边报代码,我来写的地步了,这样不好,我得自己思考 ~