當我打電話前面的代碼樣品中的HeapCreate功能,我使用了HEAP_NO_SERIALIZE標誌因爲 其餘的示例代碼不是多線程安全。HEAP_NO_SERIALIZE標誌
傑弗裏裏希特(通過C/C++的Windows)
在他的書中寫的句子,但它的怪異。
如果代碼不是多線程安全的,他不必使用該標誌。
這是一個錯誤?或者我誤解了一些東西?
當我打電話前面的代碼樣品中的HeapCreate功能,我使用了HEAP_NO_SERIALIZE標誌因爲 其餘的示例代碼不是多線程安全。HEAP_NO_SERIALIZE標誌
傑弗裏裏希特(通過C/C++的Windows)
在他的書中寫的句子,但它的怪異。
如果代碼不是多線程安全的,他不必使用該標誌。
這是一個錯誤?或者我誤解了一些東西?
通過HEAP_NO_SERIALIZE標誌,您可以告訴Heap它永遠不會被不同的線程訪問,因此根本不需要線程安全性。
如果你沒有指定這個標誌,堆將在每次調用HeapXXX函數時在內部獲得一個鎖,因此儘管你只從一個線程訪問堆,但你會有這個開銷。
編輯:在這個示例中,因爲它根本不是線程安全的(因此我假設不以任何方式使用線程),所以通知堆是非常合理的,它不能是線程安全的。
默認情況下,Windows堆執行額外的邏輯以確保沒有兩個線程同時從堆中分配內存。如何這正是做仍然是一個祕密,但它可能會是這樣的:
EnterCriticalSection (&cs);
... // Perform logic to allocate memory, set list pointers, ...
LeaveCriticalSection (&cs);
但是,如果你的應用程序沒有使用多線程,關鍵部分可能有一個不可忽視的開銷。爲了消除這種開銷,你必須傳遞標誌HEAP_NO_SERIALIZE,它將刪除對關鍵部分的調用,從而導致應用程序稍快。
「不是多線程安全的」意思是「不使用多線程」? – Benjamin 2010-08-25 08:42:12
我認爲你(和DarthCoder)認爲兩個詞都是平等的。你不是嗎?但它看起來不同於我。 – Benjamin 2010-08-25 08:53:07
線程安全意味着您的代碼可以同時在多個線程中使用。不是線程安全的代碼遲早會在多線程應用程序中崩潰。多線程本身意味着應用程序正在使用多個線程。您可以在單線程應用程序中使用線程安全的代碼。但建議不要在多線程應用程序中使用非線程安全代碼。 – Patrick 2010-08-25 11:28:54