2010-07-16 21 views
7

Người ta có thể sử dụng biến CRITICAL_SECTION để loại trừ lẫn nhau.OK để sao chép CRITICAL_SECTION?

Câu hỏi của tôi là: CRITICAL_SECTION có hỗ trợ sao chép không? Nếu tôi chuyển một giá trị cho một chuỗi khác, tôi có thể biết chắc chắn rằng loại trừ lẫn nhau sẽ hoạt động không?

Tôi sẽ không ngạc nhiên nếu câu trả lời là "bạn không thể làm điều đó", nhưng thật tuyệt khi có một số xác nhận chính thức. Tôi đã không thể tìm thấy một tuyên bố một trong hai cách trong tài liệu.

Trả lời

11

No. A CRITICAL_SECTION không thể sao chép được. MSDN states this explicitly:

Một đối tượng phần quan trọng không thể được di chuyển hoặc sao chép.

1

Tìm kiếm nhanh qua các tiêu đề cho biết cấu trúc được xác định trong winnt.h và định nghĩa này rõ ràng cho thấy rằng việc sao chép cấu trúc sẽ không hoạt động.

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; 

Điều đó nói rằng, tôi không biết tại sao các bộ đếm nội bộ này được lưu trữ trong cấu trúc không gian người dùng, tức là điều gì sẽ xảy ra nếu một chương trình sửa đổi?

+1

Tài liệu nêu rõ rằng bạn không thể sửa đổi nội dung của 'CRITICAL_SECTION':" Quy trình cũng không được sửa đổi đối tượng, nhưng phải xử lý đối tượng đó là mờ đục về mặt logic ". –

+0

Đó là lý do tại sao tôi nêu ra câu hỏi này. "Không thể" có nghĩa là gì? Nó không phổ biến cho bất cứ điều gì ngoài một xử lý để được manipulable bởi các chương trình người dùng. – casablanca

+0

Nếu một API nói rằng một người tiêu dùng của API _must_ không làm điều gì đó, điều đó có nghĩa là "nếu bạn làm điều này, tất cả các cược sẽ bị tắt". –

Các vấn đề liên quan