windows線程創建函數

     CreateThread是Windows的API函數(SDK函數的標準形式,直截了當的創建方式,任何場合都可以使用),提供操作系統級別的創建線程的操作,且僅限於工作者線程。不調用MFC和RTL的函數時,可以用CreateThread,其它情況不要輕易。在使用的過程中要考慮到進程的同步與互斥的關係(防止死鎖)。線程函數定義爲:DWORD WINAPI _yourThreadFun(LPVOID pParameter)。但它沒有考慮:

     (1)C Runtime中需要對多線程進行紀錄和初始化,以保證C函數庫工作正常(典型的例子是strtok函數)。

     (2)MFC也需要知道新線程的創建,也需要做一些初始化工作(當然,如果沒用MFC就沒事了)。   

     AfxBeginThread:MFC中線程創建的MFC函數,首先創建了相應的CWinThread對象,然後調用CWinThread::CreateThread,在CWinThread::CreateThread中,完成了對線程對象的初始化工作,然後,調用_beginthreadex(AfxBeginThread相比較更爲安全)創建線程。它簡化了操作或讓線程能夠響應消息,即可用於界面線程,也可以用於工作者線程,但要注意不要在一個MFC程序中使用_beginthreadex()或CreateThread()。線程函數定義爲:UINT _yourThreadFun(LPVOID pParam)

     _beginthreadex:MS對C Runtime庫的擴展SDK函數,首先針對C Runtime庫做了一些初始化的工作,以保證C Runtime庫工作正常。然後,調用CreateThread真正創建線程。  僅使用Runtime Library時,可以用_BegingThread。

      小節:實際上,這三個函數之間存在一定的調用關係,第一個純粹一些,後兩個完成自己相應的工作之後,調用前者實現線程的創建。其中CreateThread是由操作系統提供的接口,而AfxBeginThread和_BeginThread則是編譯器對它的封裝。

      小節:用_beginthreadex()、_endthreadex函數應該是最佳選擇,且都是C Run-time Library中的函數,函數的參數和數據類型都是C Run-time Library中的類型,這樣在啓動線程時就不需要進行Windows數據類型和C Run-time Library中的數據類型之間的轉化,從而,減低了線程啓動時的資源消耗和時間的消耗。但使用_beginthread,無法創建帶有安全屬性的新線程,無法創建暫停的線程,也無法獲得 線程ID,_endthread的情況類似,它不帶參數,這意味這線程的退出代碼必須硬編碼爲0。

      小節:MFC也是C++類庫(只不過是Microsoft的C++類庫,不是標準的C++類庫),在MFC中也封裝了new和delete兩中運算符,所以用到new和delete的地方不一定非要使用_beginthreadex() 函數,用其他兩個函數都可以。

      _beginthreadex和_beginthread在回調入口函數之前進行一些線程相關的CRT的初始化操作。
CRT的函數庫在線程出現之前就已經存在,所以原有的CRT不能真正支持線程,
這也導致了許多CRT的函數在多線程的情況下必須有特殊的支持,不能簡單的使用CreateThread就OK。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章