2012-11-16 43 views
7

Tôi thấy khả năng rơi vào một null_mutex (hiện tại là boost::interprocess::null_mutex) rất hữu ích khi tôi không muốn phí đồng bộ hóa trong một số trường hợp và một mutex thực ở những người khác.Có tương đương với tăng :: interprocess :: null_mutex trong C++ 11 (ví dụ: std :: null_mutex) không?

Tôi cố gắng để sử dụng mới C++ 11 mutex lớp học, nhưng tôi thấy không có tương đương cho null_mutex - mà lá tôi bối rối ..

Có, tôi biết đó là tầm thường để thực hiện (hoặc tôi có thể tiếp tục sử dụng tăng, nhưng nếu có thể tôi đang cố gắng để dính vào tiêu chuẩn và có vẻ như một thiếu sót nhỏ)

+1

Không, không có mutex rỗng trong tiêu chuẩn. –

+0

@BoPersson, không đặt câu hỏi người thông minh hơn tôi, nhưng bất kỳ lý do nào (nó quá tầm thường ..)? – Nim

+0

Tôi không biết, tôi chưa thấy đề xuất cho tiêu chuẩn. Đó có thể là lý do thực sự tại sao nó không có ở đó - không ai hỏi về nó. :-) –

Trả lời

10

Bạn có thể làm được điều này khá trivially, bằng cách tạo ra một thực hiện 'null' của khái niệm Lockable:

struct null_mutex 
{ 
    void lock() {} 
    void unlock() noexcept {} 
    bool try_lock() { return true; } 
}; 

Điều này sẽ hoạt động với std :: lock_guard:

null_mutex mux; 
std::lock_guard<null_mutex> guard(mux); 
+0

Bạn cũng sẽ muốn 'bool try_lock() {return true;}' để đáp ứng các yêu cầu có thể khóa. Tất cả các lớp và chức năng khóa tiêu chuẩn (ngay cả 'lock_guard' vì lý do nào đó) đều có yêu cầu đó. –

+0

@MikeSeymour Tôi đã triển khai cụ thể các yêu cầu tối thiểu về khái niệm: ['std :: lock_guard'] (http://en.cppreference.com/w/cpp/thread/lock_guard) chỉ yêu cầu [' BasicLockable'] (http: // en.cppreference.com/w/cpp/concept/BasicLockable). Dĩ nhiên bạn đúng và tôi sẽ làm rõ – sehe

+0

'lock_guard' không chỉ định' Có thể khóa '- xem 30.4.2.1/2. Có lẽ đó là một lỗi, vì nó không có lý do có thể hiểu được để sử dụng 'try_lock()', nhưng nó trong tiêu chuẩn. –

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