2010-10-18 24 views
5

_beginthreadex trả về một tay cầm to a thread:Phải Tôi CloseHandle() trên một xử lý thread?

m_hStreamStatsThread = (HANDLE) _beginthreadex(NULL, 0, StreamStatsThread, this, 0, NULL); 

xử lý này có thể được sử dụng nếu bạn cần phải tham khảo các chủ đề trong các cuộc gọi như TerminateThread (..) ví dụ.

Theo the MSDN page on _beginthreadex, _beginthreadex sẽ không luôn trả về một xử lý hợp lệ - ví dụ: nó cũng có thể trả về -1L do lỗi, vv ..

Khi một luồng đã hoàn thành bình thường, tôi có phải gọi CloseHandle trên tay cầm chỉ hay tôi có thể đặt giá trị của nó thành NULL/INVALID_HANDLE_VALUE?

Trả lời

9

Đồng ý với Nemanja Trifunovic.

Ngay cả sau khi chuỗi đã thoát - xử lý của nó là hợp lệ. Ví dụ, bạn có thể truy vấn giá trị trả về của nó.

Theo nguyên tắc chung: mọi chốt xử lý Win32 phải được đóng bởi CloseHandle, trừ khi được chỉ định khác.

+2

Bất kỳ nhân xử lý nào của Win32 * * (tức là mọi thứ thuộc loại 'HANDLE'). Đối với một người làm việc với WinAPI là hiển nhiên, nhưng tôi đã thấy mọi người cố gắng đóng cửa sổ/tài nguyên xử lý ('HWND',' HICON', ...) với 'CloseHandle'. :) –

+1

Vâng, bạn nói đúng. Vấn đề là đóng chốt xử lý hạt nhân. Những HWND, HICON, HCURSOR và vv là xử lý người dùng. – valdo

+1

P.S. Xử lý người dùng - ý tôi là - xử lý được hỗ trợ bởi user32. – valdo

3

Mẫu mã trên trang MSDN bạn đã đăng liên kết để bao gồm một cuộc gọi đến CloseHandle(). Đặt giá trị của xử lý thành NULL không làm giảm số lượng ref nội bộ của đối tượng hạt nhân và dù sao cũng khá vô ích.

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