当前位置:   article > 正文

多线程环境下输出流混乱问题_多线程执行时一开始执行流冲突 打印乱

多线程执行时一开始执行流冲突 打印乱

转自:https://blog.csdn.net/monkey_d_feilong/article/details/52245424  

今天在学习Linux多线程编程的时候,出现了一个比较怪异的现象,在使用读写锁访问并打印数据时出现了输出数据混乱的现象,因为多线程编程大部分用的是c的函数,但由于本人对c++比较熟悉,所以习惯性地在c代码中混杂一些c++的语句,尤其是c++的输出流cout,但会出现如上的问题,后来我就测试性地把cout输出部分全部改为printf函数,其他代码没变,重新运行发现就不会出现之前的问题了,所以得到如下结论:

     cout语句不是原子操作,每次我们往输出缓冲区中加入数据时并不会马上刷新到界面上,一般要cout.flush()后才会把缓冲区的数据输出到界面上(平时用可能极少出现这种情况,因为平时都是单线程,没有cpu执行权的抢占,所以一般都能及时刷新,但应用到多线程就不一样了,我们应该注意!),可以通过源码发现,换行endl会刷新缓冲区(endl其实是一个函数模板,函数里面输出回车后会马上调用flush()函数刷新缓冲区!),所以多线程环境下由于输出流刷新不及时,因此出现输出混乱。

      相较cout,printf()函数是原子操作的,就是输入完数据,在跳转到其他线程中时会及时地刷新输出流,把数据更新到输出界面!

      这是一个需要注意的地方!!!

 

转自:https://blog.csdn.net/monkey_d_feilong/article/details/52245424 
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/721058
推荐阅读
相关标签
  

闽ICP备14008679号