2016-01-21 18 views
6

mi chiedo perché non posso fare questo in C++ 14 (o 17)Condizione variabile e mutex condivisa

std::shared_timed_mutex mutex; 
std::unique_lock<std::shared_timed_mutex> lock(mutex); 

std::condition_variable var; 

while(!some_condition) 
    var.wait(lock); 

variabili di condizione sembrano solo lavorare con std :: mutex. Ma perché?

+0

Potete condividere il vostro caso per questo? – inf

+0

Ciò che è bello di questo è che non solo puoi aspettare un 'shared_timed_mutex' che è" write locked "come mostrato sopra, puoi anche aspettare che sia" read locked "usando' shared_lock'. Forse è necessario attendere fino a quando un thread dello scrittore aggiorna le informazioni in modo che tu possa pubblicarle. –

+0

L'uso del caso è un po 'complesso: ho un datastore con un blocco di lettura/scrittura globale (per ora). E anche serrature per oggetto. Se acquisisco un oggetto, per prima cosa blocco il blocco globale, recupero l'oggetto, blocco dell'oggetto e rilascio del blocco globale. Ora potrebbe esserci il caso in cui un oggetto viene cancellato. Quindi non voglio aspettare il blocco degli oggetti (perché anche quel blocco verrà distrutto), ma invece ho una variabile di condizione che risveglia i thread svegli quando qualcosa cambia. Forse non è il miglior design ma è privo di deadlock e non utilizza molta memoria. –

risposta

9

Questo è definito dallo standard per consentire la massima efficienza dell'implementazione. Se si desidera utilizzare un blocco diverso con condition_variable, è necessario utilizzare condition_variable_any. Si noti che l'implementazione condition_variable_any ha comunque un sovraccarico.

Citazione dalla norma: 30.5 variabili Stato

Classe condition_variable fornisce una variabile di condizione che può solo attesa in un oggetto di tipo unique_lock<mutex>, consentendo la massima effciency su alcune piattaforme.

+0

Grazie mille! Non sapevo che esistesse! –

+0

@ T.C. Grazie, stavo solo cercando di scoprire come farlo funzionare :) – inf

Problemi correlati