2012-01-26 12 views
6

Mi chiedo se le funzioni di dimensione (dimensioni, lunghezza o altro) siano thread-safe? Di solito restituiscono solo un membro di dimensioni private, come ho capito. Dubito davvero che facciano qualsiasi tipo di calcolo. Sono tutti contrassegnati come const ma sono thread-safe? ad esempio std :: list :: size?funzioni di dimensioni e sicurezza del thread in C++

Ho una funzione protetta da blocco per la scrittura e un'altra per la lettura (anch'essa protetta da blocco) ma mi chiedo se la mia funzione conteggio debba essere protetta da blocco anche con la funzione ? IMO, sembra uno spreco di tempo di risposta. Non penso che possa infrangere alcun iteratore o fallire se qualche membro viene rimosso dalla lista contemporaneamente (lo stesso, il più possibile).

+1

'count' * è * lettura. Se blocchi per altre operazioni di lettura, perché non vuoi bloccare per "contare"? Cosa lo rende speciale? –

risposta

6

Sì, deve essere protetto da una serratura. Diciamo che l'implementazione std::list::size è un valore a 32 bit, ma sulla tua piattaforma le letture a 32 bit non sono atomiche, prendono 2 letture a 16 bit. In questo caso, un secondo thread potrebbe interrompere il primo che stava leggendo la dimensione dopo che si è verificata la prima lettura, aggiornare la variabile della dimensione e poi quando si verifica la seconda lettura a 16 bit si potrebbe ottenere un valore reale per la dimensione.

+1

Questo ha spiegato perché non è thread-safe molto bene. Grazie. – Pijusn

4

No, non sono thread-safe. I contenitori standard non sono semplicemente thread-safe, periodo.

V'è tuttavia una limitata quantità di filo di sicurezza: Se ogni filo accede a un elemento diverso , e nessun elemento si accede da due fili distinti in un dato momento, allora va bene. Tuttavia, qualsiasi operazione che muta il contenitore stesso (inserire, cancellare) non è thread-safe e deve essere sincronizzato con. Di conseguenza, gli iteratori e i riferimenti potrebbero perdere la loro validità e size() viene influenzato in modo simile.

In altre parole, se separate tutte le operazioni che mutano il contenitore da quelli che non lo fanno, poi mentre non sei mutazione, si può tranquillamente chiamare size() da più thread.

+2

L'affermazione che i contenitori standard sono "semplicemente non thread-safe, periodo" è ** molto ** fuorviante! Forniscono una forma molto ragionevole di sicurezza del thread. Solo perché alcune persone desiderano una sorta di sicurezza del filo in cui possono vivere senza curarsi per i ladri mentre ottengono tutti i benefici non significa che non sono thread-safe! Il fatto che le persone non capiscano che l'accesso anche a un valore primitivo richiede la sincronizzazione è parte del problema che hanno con il threading. –