2010-07-16 56 views
7

可以使用CRITICAL_SECTION變量來實現互斥。確定要複製CRITICAL_SECTION?

我的問題是:CRITICAL_SECTION是否支持複製?如果我通過價值傳遞給另一個線程,我可以肯定地知道互斥將起作用嗎?

如果答案是「你不能這樣做」,我不會感到驚訝,但是如果有某種官方確認,我會很高興。我無法在文檔中找到任何聲明。

回答

1

快速搜索標頭可以發現該結構在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; 

這麼說,我不知道爲什麼這些內部計數器存儲在用戶空間結構,如果一個程序修改這些即會發生什麼?

+1

該文檔明確指出,您不能修改CRITICAL_SECTION的內容:「該過程也不能修改該對象,但必須將其視爲邏輯不透明。」 – 2010-07-16 22:39:50

+0

這就是爲什麼我提出這個問題。 「不能」意味着什麼?除了用戶程序可以操縱的句柄外,任何情況都不常見。 – casablanca 2010-07-16 23:31:02

+0

如果一個API表示API的使用者必須做某些事情,那就意味着「如果你這樣做了,所有的投注都關閉。」 – 2010-07-16 23:48:55