2013-10-17 40 views
2

1)本帖來自WaitForSingleObject : how to get handle from _beginthreadex的回答說只有將uintptr_t返回_beginthreadex類型爲HANDLE纔是合法的,那麼將uintptr_t返回的_beginthread轉換爲HANDLE類型是不安全的?將_beginthread返回的uintptr_t強制轉換爲HANDLE安全嗎?

2)我們在32位應用程序中投射如下,它似乎運行良好,當我將此應用程序轉換爲64位時,是否會遇到任何問題? HANDLE thread =(HANDLE)_beginthread(checkThread,0,& thrVal);

3)是否有必要將所有的_beginthread調用轉換爲_beginthreadex?

回答

0

我認爲你鏈接的問題的答案是誤導性的,或者至少是不完整的。根據該文檔爲beginthread()beginthreadex()

如果成功,這些函數返回的句柄新 創建的線程

兩者之間的區別是,通過beginthread()啓動的線程關閉其自己處理時,他們退出。因此,等待beginthread()返回的句柄是不安全的,因爲它可能在您等待時已關閉或回收。但是,如果您可以控制您啓動的線程(通過使用其他形式的同步),則可以撥打DuplicateHandle()以獲得可以安全等待的句柄。

在64的身材,uintptr_t被定義爲一個64位的值:

typedef unsigned __int64 uintptr_t; 

所以鑄造這在這種情況下HANDLE是安全的,確實是你的意思做什麼。

_beginthreadex()使您可以更好地控制新線程,包括在掛起狀態下啓動它並檢索線程ID。它還返回一個HANDLE負責關閉,這意味着它是安全的等待它。這是一個更有用,多功能的功能,但如果您不需要這些附加功能,就沒有理由只爲了它而切換。

+0

當您回答「uintptr_t」是否可以保存「HANDLE」值時,您沒有仔細閱讀文檔。您的建議與文檔有衝突。 – IInspectable

+1

@IInspectable:你無法在'HANDLE'上等待的原因並不是因爲它不是'HANDLE',而是因爲它可能已經從你下面被關閉了。只要線程正在運行,它仍然是一個有效的'HANDLE'。 –

+0

我完全理解它爲什麼不安全。你仍然不應該說「是的!」回答問題是否安全,一般情況不是。儘管如此,你並沒有說要無條件地使用返回值,就像你從_beginthreadex返回的值一樣,但是提供了有用的理由。 – IInspectable

2

如果要使用Windows同步API,則需要由您控制的HANDLE。使用從_beginthread返回的uintptr_t無法安全地轉換爲HANDLE值,以用於同步API。對於_beginthread, _beginthradex的文檔是很清楚這裏(重點煤礦):

您還可以使用由真實_beginthreadex返回與同步的API,你不能用_beginthread做線程處理。

如果你不想依靠無證行爲,如果你需要使用同步API的使用HANDLE值必須使用_beginthreadex

+1

只要線程正在運行,它就是一個有效的'HANDLE'。你沒有仔細閱讀文檔:) –

+0

@Jonathan這是一個有效的'HANDLE' *有*時間。你不能全面控制。無論如何,文件是清楚的。實施可以隨時改變。 – IInspectable

相關問題