1、儘量使用_beginthreadex()來代替使用CreateThread(),爲什麼?
_beginthreadex()函數在創建新線程時會分配並初始化一個_tiddata塊。這個_tiddata塊自然是用來存放一些需要線程獨享的數據。事實上新線程運行時會首先將_tiddata塊與自己進一步關聯起來。然後新線程調用標準C運行庫函數如strtok()時就會先取得_tiddata塊的地址再將需要保護的數據存入_tiddata塊中。這樣每個線程就只會訪問和修改自己的數據而不會去篡改其它線程的數據了。因此,如果在代碼中有使用標準C運行庫中的函數時,儘量使用_beginthreadex()來代替CreateThread()。相信閱讀到這裏時,你會對這句簡短的話有個非常深刻的印象,如果有面試官問起,你也可以流暢準確的回答了^_^。
2、WaitForSingleObject函數
WaitForSingleObject函數功能:等待函數 –使線程進入等待狀態,直到指定的內核對象被觸發。
函數原形:DWORDWINAPIWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);
函數說明:第一個參數爲要等待的內核對象。第二個參數爲最長等待的時間,以毫秒爲單位,如傳入5000就表示5秒,傳入0就立即返回,傳入INFINITE表示無限等待。
因爲線程的句柄在線程運行時是未觸發的,線程結束運行,句柄處於觸發狀態。所以可以用WaitForSingleObject()來等待一個線程結束運行。
3、實例程序
由於是多線程程序,事先記得配置VC環境,Project->Settings->C/C++->Code Generation->Use run-time libray->Debug Multithread,或 Multithread,或 Debug Multithread DLL, 或 Multithread DLL都可以,即Use run-time library需要使用多線程的。
- #include <windows.h>
- #include <process.h> /* _beginthread, _endthread */
- #include <stdio.h>
- int g_nCount;
- //子線程函數,注意格式
- unsigned int __stdcall ThreadFun(PVOID pM)
- {
- g_nCount++;
- printf("線程ID號爲%4d的子線程報數%d\n", GetCurrentThreadId(), g_nCount);
- return 0;
- }
- //主函數,所謂主函數其實就是主線程執行的函數。
- int main()
- {
- printf(" 子線程報數 \n");
- printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");
- const int THREAD_NUM = 10;
- HANDLE handle[THREAD_NUM];
- g_nCount = 0;
- for (int i = 0; i < THREAD_NUM; i++)
- handle[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, NULL, 0, NULL);
- WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);
- return 0;
- }
答案並沒有像我們想象中的順序數數輸出1到10,這是爲什麼呢,請看下節。
文章轉載於:http://blog.csdn.net/morewindows/article/details/7421759