歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 多線程時控制台輸出亂序的問題

多線程時控制台輸出亂序的問題

日期:2017/3/3 12:44:47   编辑:Linux技術

我看到很多人對這樣一個問題尋求幫助:在多線程時,往控制台窗口輸出的內容是亂序的。舉個非常簡單的例子,如下:

#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

Copyright © Linux教程網 All Rights Reserved