您的位置:首页 > 编程语言 > C语言/C++

多线程环境下使用c++输出流和printf函数的区别

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

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

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

      这是一个需要注意的地方!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: