Tôi đang cố gắng để thêm một số debug kiểm tra cho một mã CRITICAL_SECTION mở khóa, và tôi thử như sau:Tại sao thành viên OwningThread của CRITICAL_SECTION loại HANDLE, khi nó biểu thị ID luồng?
...
if (m_pCritSect) {
ASSERT(m_pCritSect->OwningThread == GetCurrentThreadId());
LeaveCriticalSection(m_pCritSect);
}
}
Từ gỡ lỗi CRITICAL_SECTIONS (Với VS 2005, chủ yếu là trên WindowsXP) Tôi "biết" rằng giá trị của OwningThread
(thành viên của cấu trúc RTL_CRITICAL_SECTION
được xác định trong winnt.h
) là giá trị của th ID của chủ đề giữ khóa.
Tuy nhiên sợi ID được đại diện bởi DWORD
(typedef cho unsigned long
) giá trị trong khi biến này có kiểu HANDLE
(typedef cho void*
) đòi hỏi
một
việc sử dụng các reinterpret_cast
cho
HandleToULong
Macro từ basetsd.h
cho đoạn mã trên để làm việc.
Ngay cả những MSDN docs nhà nước:
Khi thread đầu tiên gọi là thói quen EnterCriticalSection, (...) OwningThread trở thành thread ID của người gọi.
Vậy tại sao điều này được xác định là HANDLE
?
Chỉnh sửa Lưu ý: Tôi tìm thấy a statement nơi một poster cho thấy HANDLE/DWORD-Id không phù hợp là một số misfeature nổi tiếng của một số internals Windows. Vì vậy, có lẽ đây là trường hợp ở đây quá:
GetCurrentThreadId trả về một DWORD, mà tôi gửi đến các hạt nhân trong một tin nhắn . PsLookupThreadByThreadId lấy Id chủ đề trong HANDLE, ... ...
Đây là lỗi Windows API đã biết ("đã biết" trong đó tôi đã nói chuyện với trình quản lý bộ lọc liên quan DEV về điều này, vì nó hiển thị trong Lọc Quản lý cũng vì vấn đề API Trình quản lý I/O.) Miễn là bạn không có nhiều hơn một nửa tỷ đề và quy trình (chúng sử dụng một bảng xử lý chung), bạn sẽ ổn . Có lẽ vào thời điểm đó là một vấn đề thực sự, chúng tôi sẽ chạy một cái gì đó khác nhau. [RE: ThreadId để xử lý cho 64 bit?, 08 Aug 08 14:21, Tony Mason]
Trong mọi trường hợp, reinterpret_cast là quá mức cần thiết. Một static_cast sẽ làm. Cả HANDLE và DWORD đều là các loại không thể thiếu. –
@ArmenTsirunyan - NO, trong VS2005 bạn không thể sử dụng static_cast để truyền TAY cho một DWORD: 'lỗi C2440: 'static_cast': không thể chuyển đổi từ 'HANDLE' thành 'DWORD'' –
Thật kỳ lạ. Bạn có thể vui lòng cho tôi biết những gì họ đang gõ cho? –