多线程环境下使用c++输出流和printf函数的区别
来源:互联网 发布:免费听音乐的软件 编辑:程序博客网 时间:2024/05/17 22:21
今天在学习Linux多线程编程的时候,出现了一个比较怪异的现象,在使用读写锁访问并打印数据时出现了输出数据混乱的现象,因为多线程编程大部分用的是c的函数,但由于本人对c++比较熟悉,所以习惯性地在c代码中混杂一些c++的语句,尤其是c++的输出流cout,但会出现如上的问题,后来我就测试性地把cout输出部分全部改为printf函数,其他代码没变,重新运行发现就不会出现之前的问题了,所以得到如下结论:
cout语句不是原子操作,每次我们往输出缓冲区中加入数据时并不会马上刷新到界面上,一般要cout.flush()后才会把缓冲区的数据输出到界面上(平时用可能极少出现这种情况,因为平时都是单线程,没有cpu执行权的抢占,所以一般都能及时刷新,但应用到多线程就不一样了,我们应该注意!),可以通过源码发现,换行endl会刷新缓冲区(endl其实是一个函数模板,函数里面输出回车后会马上调用flush()函数刷新缓冲区!),所以多线程环境下由于输出流刷新不及时,因此出现输出混乱。
相较cout,printf()函数是原子操作的,就是输入完数据,在跳转到其他线程中时会及时地刷新输出流,把数据更新到输出界面!
这是一个需要注意的地方!!!
0 0
- 多线程环境下使用c++输出流和printf函数的区别
- C 【printf 和 scanf 函数的使用】
- C/C++ 之 printf 输出函数的使用
- c++多线程使用printf输出的bug
- Keil MDK环境下使用printf函数的解决方法
- C语言的格式化输出函数printf
- linux下printf()函数输出的条件
- 使用printf函数输出
- PHP echo, print, printf, sprintf函数的区别和使用
- PHP echo, print, printf, sprintf函数的区别和使用
- PHP echo, print, printf, sprintf函数的区别和使用
- PHP echo, print, printf, sprintf函数的区别和使用
- PHP echo, print, printf, sprintf函数的区别和使用
- PHP echo, print, printf, sprintf函数的区别和使用
- C语言输出函数(printf)和输入函数(scanf)
- 多线程环境下使用log4j输出各线程的标识
- puts()函数和printf函数的区别
- puts()函数和printf函数的区别
- java 几种加载驱动的方法
- 获取file域选择的图片显示在页面
- Springboot摘要
- [leetcode]257. Binary Tree Paths -- JavaScript 代码
- Educational Codeforces Round 10-D. Nested Segments
- 多线程环境下使用c++输出流和printf函数的区别
- 【JZOJ 3072】掷骰子
- php静态方法典型题分析
- 前端速学成财:第十一课-实战演练:用gulp 构建前端页面(1)---静态构建
- java笔记之线程
- 火神的鱼
- 摇一摇听歌的小Demo
- 图的深度遍历
- ssh整合错误