2012-10-22 27 views
5

Theo như tôi biết trong các phiên bản cũ của việc triển khai Boost boost::mutex cho Windows đã được thực hiện bằng các phần quan trọng. Nhưng trong phiên bản mới nhất của Boost 1.51 tôi phát hiện ra rằng hiện nay việc thực hiện mutex dựa trên Sự kiện.Tăng cường triển khai Mutex cho Windows

Không ai biết lý do đằng sau thay đổi này là gì? Có phải vì lý do hiệu suất không? Các phần quan trọng có bị phản đối không?

+0

Bạn có xem xét các thay đổi tăng cường không? – PlasmaHH

+1

Theo như tôi thấy, nó đã được thực hiện để đơn giản hóa và thống nhất thiết kế của các mutex khác nhau: hiện tại 'mutex',' timed_mutex', 'try_mutex' - tất cả được thực hiện bằng cách sử dụng' detail :: basic_timed_mutex', không thể sử dụng CS. (Trên thực tế, việc sử dụng CS không phải lúc nào cũng là lựa chọn tốt nhất, nó phụ thuộc vào kịch bản đồng thời, vì vậy nó không đáng để thiết kế cho điều đó.) –

+1

Bạn nhận ra rằng chỉ có các nhà thiết kế mới có thể trả lời đầy đủ điều này. Phần còn lại của chúng tôi chỉ có thể suy đoán ... – Tudor

Trả lời

5

Thật tuyệt vời khi sử dụng boost chúng tôi luôn có cách tiếp cận tốt nhất mà không có thay đổi? Trong phiên bản mới boost, boost::mutex được thực hiện như một spinlock nhưng với sự trợ giúp của một sự kiện cửa sổ để tránh sự chờ đợi bận rộn và sự kiện đó sẽ chỉ được tạo nếu cần thiết, vì vậy nó rất nhẹ và có hiệu suất rất cao và cũng có thể kích hoạt boost để sử dụng trọng lượng nhẹ này mutex để chờ thời gian! Tôi nghĩ điều này là tuyệt vời

+0

Điều này không thể đúng, một khóa quay thực sự chỉ có thể ở chế độ hạt nhân ... – Benj

+0

@Benj và ai nói rằng chúng ta cần một spinlock thực sự ở đây? Nhiều phần của 'boost' phụ thuộc vào spinlock được thực hiện bằng cách sử dụng các biến nguyên tử, ví dụ hãy xem xét việc thực hiện' boost :: shared_ptr' và 'boost :: detail :: spinlock' và viết một chương trình nhỏ so sánh hiệu năng của spinlock đó thực hiện với khóa nhanh nhất được triển khai trên các cửa sổ và thậm chí cả hệ thống * nix và bạn thấy kết quả đó thật tuyệt vời! – BigBoss

+2

Bạn gần như chính xác, nhưng thực sự 'boost :: mutex' không sử dụng spinlocks cả! Nó sử dụng các op nguyên tử như là một tối ưu hóa: khi lấy khóa, trước tiên nó sẽ (kiểm tra nguyên tử) kiểm tra một biến cho biết liệu mutex có bị khóa hay không. Nếu không bị khóa, sau đó nó có thể tiếp tục (mà không cần phải xem xét sự kiện win32 ở tất cả), đó là con đường nhanh. Nếu kiểm tra cho biết rằng mutex bị khóa, thì những thứ win32 đắt tiền hơn sẽ được phát. Nhưng ở đây không có spinlocks ở tất cả ;-) – Frunsi

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