多线程下控制台输出乱序的问题

我看到很多人对这样一个问题寻求帮助:在多线程时,往控制台窗口输出的内容是乱序的。举个非常简单的例子,如下:
#include "stdafx.h"
#include
using namespace std;

DWORD WINAPI ThreadProc1(
                                          LPVOID lpParameter
                                          )
{
       int i=0;
       while ( i<20 )
       {
              cout<<"first thread cout:"<
              i++;
              Sleep(200);
       }
       return 0;
}

DWORD WINAPI ThreadProc2(
                                            LPVOID lpParameter
                                            )
{
       int i=0;
       while ( i<20 )
       {
              cout<<"second thread cout:"<
              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;
}
创建了两个子线程,每个子线程各自输出内容。运行结果:控制台上输出的内容是乱序的,而且每次结果不尽相同。
      多线程下控制台输出乱序的问题_第1张图片 
原因:往控制台窗口输出的过程(cout)并不是多线程安全的,在一个线程输出过程中另一个线程也可以输出。
解决办法:对输出出进行同步,利用临界区就可以很容易办到。代码修改如下:

CRITICAL_SECTION g_CS;   //定义一个临界区

InitializeCriticalSectio n( &g_CS ); //在程序开始的地方,对临界区初始化

在所有涉及到输出的地方改为:
               EnterCriticalSection( &g_CS );
              cout<<"first thread cout:"<
              LeaveCriticalSection( &g_CS );

总结:在编写多线程的程序时,一定要特别注意同步的问题,仔细的考虑清楚哪些变量、资源、操作需要进行同步,否则就会得到莫名其妙的结果。

转自:http://blog.sina.com.cn/s/blog_4e2d49620100a252.html

你可能感兴趣的:(C++)