NO IMAGE

我看到很多人對這樣一個問題尋求幫助:在多執行緒時,往控制檯視窗輸出的內容是亂序的。舉個非常簡單的例子,如下:
#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 );

總結:在編寫多執行緒的程式時,一定要特別注意同步的問題,仔細的考慮清楚哪些變數、資源、操作需要進行同步,否則就會得到莫名其妙的結果。

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