※ 引述《licheer (HOPE)》之銘言:
: VC++中, 盡可能使用 CRT 的 _beginthreadex
: 少用 WIn32 API CreateThread
: 原因是 CreateThread 有機會造成記憶體洩漏, 或是不能保證 thread-safe
: _beginthreadex 其實也是呼叫 CreateThread
: 並多增加一些操作來避免上述問題發生
: 看到這裡, 有點混淆了 CRT 和 Win32 API 的關係
: CRT 應該是比較底層, 上層是 Win32 API
: 但 _beginthreadex 的說明, 又好像 Win32 API 再底層
: 兩者間是怎樣的關係呢?
: 請各位大大解惑,謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.44.247.131
※ 編輯: chengcti 來自: 114.44.247.131 (12/07 10:35)
因為 CreateThread API 你自己要做很多的保護和資源 allocation
CRT 中的 _beginthread 會幫你處理
例如 CreateThread() 得到的 Handle
你什麼時候做 CloseHandle()?
你是先 suspend thread 後面再啟動? 還是一呼叫 CreateThread 就開始執行
VC 透過 _beginthread() _endthread() 幫你做很多這類的保護
最終他還是呼叫 CreateThread API
早期處理 thread, 都是直接呼叫 WINAPI
但是常碰到有些使用者對於 thread 呼叫 碰到很多不確定什麼時候該清除資源的問題
因此才提供 CRT 當然你一用 CRT 希望有關 thread 就全部都用 CRT 處理
不要用 CRT 拿到 handle 後面再拿去 winapi 呼叫
ex:
hThread =_beginthread()
CloseThread(hThread)
在 VC11 中支援 c++11
對於 thread 會有另外一套子集來支援 thread & parallel
可以參考 VC\crt\src\thread.c
有 _beginthread() 怎麼處理 thread 的流程