標籤:資訊 建立線程 為什麼 ant api i++ 程式開發 word 手動
不得不說,做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); 8 9 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編程之線程池的使用