1. 程式人生 > >控制檯應用執行多執行緒時輸出控制

控制檯應用執行多執行緒時輸出控制

現在用C++實現多執行緒已經不是難事。但是,在控制檯應用中實現多執行緒時,各執行緒的輸出控制就是一個問題,如果處理不好,由於執行緒的CPU資源是搶佔式的,輸出會亂七八糟。對此,我們可以使用條件迴圈來控制,一下給出一個例子,找到兩個範圍內能被2,3,5,7整除的數。

#include<iostream>
#include<Windows.h>
using namespace std;
UINT FoundFlag = 0;//全域性標誌,如果找到符合條件的數,改變FLAG的值以通知執行緒暫停
UINT StopFlag = 0;//執行終止標誌,防止主執行緒的“請按任意鍵繼續...
”出現在輸出中 bool IsStrange(int i) { if (i % 2 == 0 && i % 3 == 0 && i % 5 == 0 && i % 7 == 0) { return true; } return false; } DWORD WINAPI ThreadFunc1(LPVOID lpParam)//執行緒函式1 { for (int i = 0; i < 50000000; i++) { if (FoundFlag) { while
(FoundFlag)//如果另一個執行緒找到了一個結果,那麼暫停執行,等待另一個執行緒完成輸出 { Sleep(1);//此處不能使用死迴圈,否則會佔用CPU資源 } } if (IsStrange(i)) { FoundFlag = 1;//通知另一個執行緒暫停執行 cout << "One strange number found! It is " << i << ".\tFrom Func: 1"
<< endl; FoundFlag = 0;//恢復執行 } } StopFlag++; return 0; } DWORD WINAPI ThreadFunc2(LPVOID lpParam) { for (int i = 50000000; i < 100000000; i++) { if (FoundFlag) { while (FoundFlag) { Sleep(1); } } if (IsStrange(i)) { FoundFlag = 1; cout << "One strange number found! It is " << i << ".\t.From Func: 2" << endl; FoundFlag = 0; } } StopFlag++; return 0; } int main() { HANDLE hThread1,hThread2; DWORD uID1,uID2; hThread1 = ::CreateThread(0, 0, ThreadFunc1, NULL, 0, &uID1); hThread2 = ::CreateThread(0, 0, ThreadFunc2, NULL, 0, &uID2); ::WaitForSingleObject(hThread1, INFINITY); ::WaitForSingleObject(hThread2, INFINITY); ::CloseHandle(hThread1); ::CloseHandle(hThread2); while (StopFlag < 2)//兩個執行緒都結束後StopFlag的值會增加到2,此時主執行緒停止等待,輸出“請按任意鍵繼續...”字樣提示使用者程式即將終止 { Sleep(1); } system("pause"); return 0; }