Differenze tra variabili condizionali, mutex e blocchi
-
20-08-2019 - |
Domanda
Ad esempio le c ++ 0x interfacce
Sto facendo fatica a capire quando usare quali di queste cose (cv, mutex e lock). Qualcuno può spiegare o indicare una risorsa?
Grazie in anticipo.
Soluzione
Nella pagina a cui fai riferimento, " mutex " è l'attuale primitiva di sincronizzazione di basso livello. Puoi prendere un mutex e poi rilasciarlo, e solo un thread può prenderlo in qualsiasi momento (quindi è una primitiva di sincronizzazione). Un mutex ricorsivo è uno che può essere preso più volte dallo stesso thread, quindi deve essere rilasciato tante volte dallo stesso thread prima che altri lo possano prendere.
A " lock " qui c'è solo una classe wrapper C ++ che prende un mutex nel suo costruttore e lo rilascia al distruttore. È utile per stabilire la sincronizzazione per gli ambiti C ++.
Una variabile di condizione è una forma più avanzata / di alto livello di primitiva sincronizzante che combina un blocco con un " segnalazione " meccanismo. Viene utilizzato quando i thread devono attendere che una risorsa diventi disponibile. Un thread può & Quot; attendere & Quot; su un CV e quindi il produttore della risorsa può " segnalare " la variabile, nel qual caso i thread che attendono il CV vengono avvisati e possono continuare l'esecuzione. Un mutex è combinato con CV per evitare le condizioni di gara in cui un thread inizia ad attendere un CV nello stesso momento in cui un altro thread vuole segnalarlo; quindi non è controllabile se il segnale viene consegnato o si perde.
Altri suggerimenti
Non sono troppo familiare con C ++ 0x quindi prendi questa risposta con un granello di sale.
re: Mutex vs. locks: dalla documentazione che hai pubblicato, sembra che mutex
sia un oggetto che rappresenta un mutex del sistema operativo, mentre un lock
è un oggetto che contiene un mutex per facilitare modello RAII .
Le variabili di condizione sono un pratico meccanismo per associare un meccanismo di blocco / segnalazione (segnale + attesa) con un meccanismo di esclusione reciproca, ma mantenerle disaccoppiate nel sistema operativo in modo che tu come programmatore di sistema possa scegliere l'associazione tra condvar e mutex. (utile per gestire più insiemi di oggetti a cui si accede contemporaneamente) Rob Krten ha alcuni buone spiegazioni sui condvars in uno dei capitoli online del suo libro su QNX .
Per quanto riguarda i riferimenti generali: Questo libro (non ancora pubblicato) sembra interessante.