多线程环境下输出流混乱问题
转自:https://blog.csdn.net/monkey_d_feilong/article/details/52245424今天在学习Linux多线程编程的时候,出现了一个比较怪异的现象,在使用读写锁访问并打印数据时出现了输出数据混乱的现象,因为多线程编程大部分用的是c的函数,但由于本人对c++比较熟悉,所以习惯性地在c代码中混杂一些c++的语句,尤其是c++的输出流cout,但会...
转自: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
更多推荐
所有评论(0)