Trong môi trường Windows, là mutex được cải tiến của Boost bằng cách sử dụng các phần quan trọng của WinAPI, hay cái gì khác?Có sự khác biệt nào giữa mutex có phạm vi của Boost và phần quan trọng của WinAPi không?
Trả lời
Phiên bản hiện tại của boost::mutex
không sử dụng Win32 CRITICAL_SECTION
cũng như Win32 Mutex. Thay vào đó, nó sử dụng các hoạt động nguyên tử và một sự kiện Win32 để chặn chờ đợi.
Phiên bản cũ hơn (tăng 1.34.1 và trước đó) là trình bao bọc xung quanh CRITICAL_SECTION
trên Windows.
Ngẫu nhiên, bản thân mutex không bị nhiễu. Loại boost::mutex::scoped_lock
và, trong các phiên bản gần đây, boost::lock_guard<boost::mutex>
và boost::unique_lock<boost::mutex>
cung cấp trình bao bọc RAII để khóa một mutex để đảm bảo bạn không quên mở khóa.
Các mẫu boost::lock_guard<>
và boost::unique_lock<>
hoạt động với bất kỳ loại nào có chức năng lock()
và unlock()
thành viên, vì vậy bạn có thể sử dụng chúng với mutex tương tác nếu muốn.
Cảm ơn bạn đã trả lời. – nhaa123
Điều này có lẽ gần như/cũng hiệu quả như một Phần quan trọng của Win32? – unixman83
@ unixman83: Tôi nghi ngờ nó, một phần quan trọng là nhanh bởi vì nó đang trong quá trình chỉ, bạn không thể sử dụng nó giữa các quá trình. Nó không phải là một đối tượng hạt nhân, nhưng sự kiện Win32 là. Vì vậy, tôi cho rằng điều này không nhanh bằng CS. – gbjbaanb
Chỉ có thể sử dụng CRITICAL_SECTION của Win32 trong số các chủ đề của một quy trình. Nếu bạn cần phải sử dụng một cái gì đó giữa các quá trình, bạn cần một mutex. Boost nói không có gì về các phần quan trọng vì vậy tôi sẽ giả sử nó đang sử dụng mutexes.
"phạm vi" chỉ có nghĩa là nó có trình bao bọc sử dụng RAII để tự động mở khóa mutex ở cuối phạm vi cụ thể.
Bạn đã không xem xét mã nguồn Boost, phải không? :) – OregonGhost
Tôi đang ở một vị trí mà tôi không có quyền truy cập vào nó: ( – nhaa123
Bạn cần truy cập Internet cho cả nguồn Stack Overflow và Boost. Http://svn.boost.org/svn/boost/trunk/ – ognian