多线程下控制台输出乱序的问题
来源:互联网 发布:37传奇霸业宝石数据 编辑:程序博客网 时间:2024/06/10 09:43
我看到很多人对这样一个问题寻求帮助:在多线程时,往控制台窗口输出的内容是乱序的。举个非常简单的例子,如下:
#include "stdafx.h"
#include <Windows.h>
using namespace std;
DWORD WINAPI ThreadProc1(
LPVOID lpParameter
)
{
int i=0;
while ( i<20 )
{
cout<<"first thread cout:"<<i<<endl; //往控制台窗口输出
i++;
Sleep(200);
}
return 0;
}
DWORD WINAPI ThreadProc2(
LPVOID lpParameter
)
{
int i=0;
while ( i<20 )
{
cout<<"second thread cout:"<<i<<endl; //往控制台输出
i++;
Sleep(200);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread[2];
hThread[0] = CreateThread( NULL, NULL, ThreadProc1, NULL, NULL, NULL );
hThread[1] = CreateThread( NULL, NULL, ThreadProc2, NULL, NULL, NULL );
WaitForMultipleObjects(2, hThread, TRUE, INFINITE );
return 0;
}
创建了两个子线程,每个子线程各自输出内容。运行结果:控制台上输出的内容是乱序的,而且每次结果不尽相同。
原因:往控制台窗口输出的过程(cout)并不是多线程安全的,在一个线程输出过程中另一个线程也可以输出。
解决办法:对输出出进行同步,利用临界区就可以很容易办到。代码修改如下:
CRITICAL_SECTION g_CS; //定义一个临界区
InitializeCriticalSection( &g_CS ); //在程序开始的地方,对临界区初始化
在所有涉及到输出的地方改为:
EnterCriticalSection( &g_CS );
cout<<"first thread cout:"<<i<<endl;
LeaveCriticalSection( &g_CS );
#include "stdafx.h"
#include <Windows.h>
using namespace std;
DWORD WINAPI ThreadProc1(
{
}
DWORD WINAPI ThreadProc2(
{
}
int _tmain(int argc, _TCHAR* argv[])
{
}
创建了两个子线程,每个子线程各自输出内容。运行结果:控制台上输出的内容是乱序的,而且每次结果不尽相同。
原因:往控制台窗口输出的过程(cout)并不是多线程安全的,在一个线程输出过程中另一个线程也可以输出。
解决办法:对输出出进行同步,利用临界区就可以很容易办到。代码修改如下:
CRITICAL_SECTION g_CS;
InitializeCriticalSectio
在所有涉及到输出的地方改为:
总结:在编写多线程的程序时,一定要特别注意同步的问题,仔细的考虑清楚哪些变量、资源、操作需要进行同步,否则就会得到莫名其妙的结果。
转自:http://blog.sina.com.cn/s/blog_4e2d49620100a252.html
0 0
- 多线程下控制台输出乱序的问题
- 多线程时控制台输出乱序的问题
- 多线程环境过度优化下的CPU乱序问题
- VC++深入详解(13):详细分析控制台应用程序下的多线程输出
- 乱序的序列保序输出
- 乱序字符串的问题
- list乱序输出
- 解决Qt控制台程序在控制台输出中文的问题
- eclipse控制台无法输出的问题
- 关于Logger日志的控制台输出问题
- webservice-cxf 控制台输出日志的问题
- Jenkins控制台输出乱码的问题
- windows下控制台输出\r、\n的区别及导致的问题
- Windows下控制台输出
- Linux下Tomcat控制台输出及日志中文乱码问题的解决
- Linux下Tomcat控制台输出及日志中文乱码问题的解决
- 【Intellji 14.1.4下 中文注释乱码 & 控制台输出中文乱码 问题的解决方案
- Xcode8 控制台打印的问题 (日志输出的问题)
- 一键截屏 5.0以下使用命令模式 5.0以上使用系统截屏
- 派生类到基类的转换 和基类到派生类的转换 http://blog.csdn.net/wyyzsl212328/article/details/8263959
- Flash As3.0 实现队列,先进先出
- angular 文件上传
- Accord.NET 安装配置
- 多线程下控制台输出乱序的问题
- 安卓进程线程那些事
- java死锁
- java web 项目中定时器的写法
- 关于tableView的重用池问题
- paramiko
- 【读Android源码,提升编码水平之一:图片缓存机制】
- h5案例分享 华谊电影《老炮儿》约战
- Android平台Camera实时滤镜实现方法探讨(九)--磨皮算法探讨(一)