多线程环境下使用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()函数是原子操作的,就是输入完数据,在跳转到其他线程中时会及时地刷新输出流,把数据更新到输出界面!
这是一个需要注意的地方!!!
cout语句不是原子操作,每次我们往输出缓冲区中加入数据时并不会马上刷新到界面上,一般要cout.flush()后才会把缓冲区的数据输出到界面上(平时用可能极少出现这种情况,因为平时都是单线程,没有cpu执行权的抢占,所以一般都能及时刷新,但应用到多线程就不一样了,我们应该注意!),可以通过源码发现,换行endl会刷新缓冲区(endl其实是一个函数模板,函数里面输出回车后会马上调用flush()函数刷新缓冲区!),所以多线程环境下由于输出流刷新不及时,因此出现输出混乱。
相较cout,printf()函数是原子操作的,就是输入完数据,在跳转到其他线程中时会及时地刷新输出流,把数据更新到输出界面!
这是一个需要注意的地方!!!
相关文章推荐
- C/C++ 之 printf 输出函数的使用
- 多线程环境下使用log4j输出各线程的标识
- c++CreateEvent函数在多线程中使用及实例
- c++CreateEvent函数在多线程中使用及实例
- 怎样在TI stellaris lm3sxxx 程序中使用C语言printf()函数进行串口输出
- C++ 多线程中使用cout还是printf
- 在CCS中使用printf函数输出的问题和解决过程
- C/C++中自定义信息输出——printf与宏的配合使用
- MFC的GUI窗口使用Console输出函数printf
- c++CreateEvent函数在多线程中使用及实例
- IAR使用printf()函数 打印输出
- c++CreateEvent函数在多线程中使用及实例
- C++为什么不提倡使用scanf和printf函数
- 关于流文件输出cout与标准输出函数printf的区别
- 多线程环境下使用log4j输出各线程的标识,区分各线程输出的内容
- C函数printf中不能使用%lf,而用%f输出double,而函数scanf却必须用%lf来输入double
- MFC的GUI窗口使用Console输出函数printf
- Keil MDK环境下使用printf函数的解决方法
- (转)MFC的GUI窗口使用Console输出函数printf
- 【C++学习笔记】使用控制符及流对象的成员函数控制输出格式