1. 具體說來,createthread這個函數是windows提供給使用者的 api函數,是sdk的标準形式,在使用的過程
中要考慮到程序的同步與互斥的關系,程序間的同步互斥等一系列會導緻作業系統死鎖的因素,用起來比較繁
瑣一些,初學的人在用到的時候可能會産生不可預料的錯誤,建議多使用afxbeginthread,是編譯器對原來的
createthread函數的封裝,用與mfc程式設計(當然,隻要修改了項目屬性,console和win32項目都能調用)而_
beginthread是c的運作庫函數。
在使用afxbeginthread時,線程函數的定義為:uint _yourthreadfun(lpvoid pparam)參數必須如此
在使用createthread時,線程的函數定義為: dword winapi _yourthreadfun(lpvoid pparameter)
2.createthread:是windows的api函數,直截了當的建立了線程。它沒有考慮:
1)c runtime中需要對多線程進行紀錄和初始化,以保證c函數庫工作正常(典型的例子是strtok函數)。
2)mfc也需要知道新線程的建立,也需要做一些初始化工作(當然,如果沒用mfc就沒事了)。
_beginthreadex:ms對c runtime庫的擴充函數,首先針對c runtime庫做了一些初始化的工作,以保證
c runtime庫工作正常。然後,調用createthread真正建立線程。
afxbeginthread:mfc中線程建立的函數,首先建立了相應的cwinthread對象,然後調用
cwinthread::createthread, 在cwinthread::createthread中,完成了對線程對象的初始化工作,
然後,調用_beginthreadex建立線程。
createthread()是win32 api
afxbeginthread()是mfc的函數
如果用mfc程式設計,不要用createthread,如果隻是使用runtime library,用 _begingthread,總之,不要輕易使用createthread
這是因為在mfc和rtl中的函數有可能會用到些它們所封裝的公用變量,也就是說afxbeginthread和_beginthread都有自己的啟動代碼是createthread所沒有的在用createthread所建立的線程中使用mfc的類和rtl函數就有可能出現問題
如果你是用彙編編寫win32程式并且線上程函數中也不調用mfc和rtl的函數,那用 createthread就沒問題,或者你雖然是用c寫線程函數,但你很小心沒調用rtl函數
也不會有問題
createthread是由作業系統提供的接口,而afxbeginthread和_beginthread則是編譯
器對它的封裝
tls可以以一種更簡單的方式使用,那就是通過winodws對c所作的擴充關鍵字__declspec和擴充存儲類型修飾符thread。例如:
__declspec(thread) int global_tls_i = 1; //
在函數外部,聲明一個tls變量
__declspec(thread) static int local_tls_i = 2; //
在函數内部聲明一個靜态tls變量