WIndows編程之線程池的使用
阿新 • • 發佈:2017-08-06
信息 light elong space exc 沒有 效果 string kit
不得不說,做C++服務器程序開發,要是不理解線程池,不懂線程池,做C++服務器端的程序就沒有任何意義。特別就是上次我因為理解錯了線程池而做錯了一件事,而被指導人批了一頓,至今記憶猶新,所以趁著周末學了下線程池的使用,小有成績。
先看一種比較簡單的線程池的實現。
1 #include <windows.h> 2 #include <string> 3 #include <iostream> 4 5 using namespace std; 6 7 #define BEGINTHREAD(Fun,Param) CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun,Param,0,NULL); 89 DWORD WINAPI ThreadProc(LPVOID lpParameter); 10 11 int main() 12 { 13 14 string words[10] = { "I am a gay.....", "I am a gay, too", "Let us do something exceting", "ah, Do you want to do it in the forest or in the bed?", "neither, I want to do it on the street. haha", 15 "I heard you like music.", "Yeah, Just like the light music.", "For example...", "bosty music and so on", "ah, you mean that is the light music...." }; 16 17 for (int i = 0; i < 10; i++) 18 { 19 //下面的代碼演示了,使用CreateThread和QueueUserWorkItem,實際效果 20 //是一樣的,當然線程不多的情況下如此,如果線程很多時一定要使用QueueUserWorkItem21 QueueUserWorkItem(ThreadProc, (PVOID)&words, WT_EXECUTELONGFUNCTION); 22 23 //顯示使用CreateThread來創建多個線程的效果 24 //BEGINTHREAD(ThreadProc, (LPVOID)&words[i]); 25 } 26 27 while (true); 28 29 return 0; 30 } 31 32 //該函數可以由CreateThread的線程啟動,也可以使用QueueUserWorkItem線程池中的線程啟動 33 DWORD WINAPI ThreadProc(LPVOID lpParameter) { 34 while (true) 35 { 36 std::string word = *(std::string*)lpParameter; 37 std::cout << "線程[ID:" << GetCurrentThreadId() << "]說:" << word << std::endl; 38 Sleep(5 * 1000); 39 } 40 return 0; 41 }
這裏我們沒有使用到任何線程池的信息,就可以直接使用線程池了,因為我們使用的方法裏頭默認給我們創建了一個線程池,但是在實際服務器的開發中,我們必須設置線程池的大小,必須自定義線程池的屬性,就必須設置線程池的信息,這時就需要我們手動調用來創建線程池。
運行截圖:
從這張圖片裏面也可以看出線程池裏面執行的情況與我們自定義多線程還是有很大區別的,多線程裏面的輸出語句是不會被打斷的,但是再看看我們的程序,連輸出語句也被打斷了。(具體多線程裏面的輸出語句為什麽沒有被打斷,目前我也不清楚,按理是應該被打斷的)
未完,待續。。。。
WIndows編程之線程池的使用