閱讀832 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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可以以一種更簡單的方式使用,那就是通過WinodwsC所作的擴展關鍵字__declspec和擴展存儲類型修飾符thread。例如:
    __declspec(thread) int global_tls_i = 1;        // 在函數外部,聲明一個TLS變量
    __declspec(thread) static int local_tls_i = 2;  // 在函數內部聲明一個靜態TLS變量

最後更新:2017-04-03 14:54:03

  上一篇:go android view視圖的層疊(疊加)
  下一篇:go 使用C#開發基於Winform的手機號碼歸屬地查詢工具