可以使用CRITICAL_SECTION變量來實現互斥。確定要複製CRITICAL_SECTION?
我的問題是:CRITICAL_SECTION是否支持複製?如果我通過價值傳遞給另一個線程,我可以肯定地知道互斥將起作用嗎?
如果答案是「你不能這樣做」,我不會感到驚訝,但是如果有某種官方確認,我會很高興。我無法在文檔中找到任何聲明。
可以使用CRITICAL_SECTION變量來實現互斥。確定要複製CRITICAL_SECTION?
我的問題是:CRITICAL_SECTION是否支持複製?如果我通過價值傳遞給另一個線程,我可以肯定地知道互斥將起作用嗎?
如果答案是「你不能這樣做」,我不會感到驚訝,但是如果有某種官方確認,我會很高興。我無法在文檔中找到任何聲明。
編號A CRITICAL_SECTION
不能被複制。 MSDN states this explicitly:
臨界區對象不能移動或複製。
快速搜索標頭可以發現該結構在winnt.h
中定義,這個定義清楚地表明覆制結構不起作用。
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
//
// The following three fields control entering and exiting the critical
// section for the resource
//
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
ULONG_PTR SpinCount; // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
這麼說,我不知道爲什麼這些內部計數器存儲在用戶空間結構,如果一個程序修改這些即會發生什麼?
該文檔明確指出,您不能修改CRITICAL_SECTION的內容:「該過程也不能修改該對象,但必須將其視爲邏輯不透明。」 – 2010-07-16 22:39:50
這就是爲什麼我提出這個問題。 「不能」意味着什麼?除了用戶程序可以操縱的句柄外,任何情況都不常見。 – casablanca 2010-07-16 23:31:02
如果一個API表示API的使用者必須做某些事情,那就意味着「如果你這樣做了,所有的投注都關閉。」 – 2010-07-16 23:48:55