2012-11-16 12 views
7

Trovo la possibilità di inserire un null_mutex (attualmente boost::interprocess::null_mutex) molto utile quando non voglio il sovraccarico di sincronizzazione in alcuni casi e un mutex reale in altri.Esiste un equivalente a boost :: interprocess: null_mutex in C++ 11 (ad es. Std :: null_mutex)?

Sto cercando di utilizzare il nuovo C++ 11 mutex classi, ma non vedo alcun equivalente per null_mutex - che mi lascia perplesso ..

Sì, lo so che è banale da implementare (o posso continuare a utilizzare spinta, ma, se possibile, sto cercando di attaccare il livello e sembra una piccola omissione)

+1

No, non esiste alcun mutex null nello standard. –

+0

@BoPersson, non per interrogare persone più intelligenti di me, ma per qualsiasi motivo (è troppo banale ..)? – Nim

+0

Non lo so, non l'ho visto proposto per lo standard. Questo potrebbe essere il vero motivo per cui non è lì - nessuno lo ha chiesto. :-) –

risposta

10

si può fare questo abbastanza banalmente, con la creazione di un'implementazione 'null' del concetto Lockable:?

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

Funzionava con std :: lock_guard:

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

Avrai anche bisogno di 'bo try_lock() {return true;}' per soddisfare i requisiti Lockable. Tutte le classi e le funzioni di blocco standard (anche 'lock_guard' per qualche ragione) hanno quel requisito. –

+0

@MikeSeymour Ho implementato in modo specifico i requisiti minimi del concetto: ['std :: lock_guard'] (http://en.cppreference.com/w/cpp/thread/lock_guard) richiede solo [' BasicLockable'] (http: // en.cppreference.com/w/cpp/concept/BasicLockable). Ovviamente hai ragione e chiarirò – sehe

+0

'lock_guard' specifica' Lockable' - vedi 30.4.2.1/2. Forse è un errore, dal momento che non ha alcun motivo plausibile per usare 'try_lock()', ma è nello standard. –

Problemi correlati