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