控制檯應用執行多執行緒時輸出控制
阿新 • • 發佈:2019-02-16
現在用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;
}