天天看點

AfxBeginThread和CreateThread具體差別

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變量