Std :: vector o boost :: vector thread safe?

Ho più thread contemporaneamente chiamando push_back() su un object condiviso di std::vector . std::vector thread safe? O devo implementare personalmente il meccanismo per renderlo sicuro?
Voglio evitare di fare un lavoro extra di “blocco e liberazione” perché sono un utente della biblioteca piuttosto che un progettista di librerie. Spero di cercare soluzioni thread-safe esistenti per il vettore. Che ne dici di boost::vector , che è stato introdotto di recente da boost 1.48.0 in poi. È thread-safe?

Lo standard C ++ rende certe garanzie di threading per tutte le classi nella libreria C ++ standard. Queste garanzie potrebbero non essere come ci si aspetterebbe che fossero, ma per tutte le classi di librerie C ++ standard sono garantite determinate garanzie di sicurezza. Assicurati di leggere le garanzie fatte, tuttavia, poiché le garanzie di threading dei contenitori C ++ standard di solito non sono allineate con ciò che vorresti che fossero. Per alcune classi diverse, solitamente più forti, vengono fatte delle garanzie e la risposta di seguito si applica specificamente ai contenitori. I contenitori hanno essenzialmente le seguenti garanzie sulla sicurezza del filo:

  1. ci possono essere più lettori concorrenti dello stesso contenitore
  2. se c’è uno scrittore, non ci saranno più scrittori e lettori

Questi in genere non sono quelli che le persone vorrebbero come garanzie di sicurezza dei thread ma sono molto ragionevoli data l’interfaccia dei contenitori standard: sono pensati per essere utilizzati in modo efficiente in assenza di thread di accesso multipli. L’aggiunta di qualsiasi tipo di blocco per i loro metodi interferirebbe con questo. Oltre a ciò, l’interfaccia dei contenitori non è realmente utile per qualsiasi forma di blocco interno: generalmente si utilizzano metodi multipli e gli accessi dipendono dal risultato degli accessi precedenti. Ad esempio, dopo aver verificato che un contenitore non sia empty() , è ansible accedere a un elemento. Tuttavia, con il blocco interno non vi è alcuna garanzia che l’object sia ancora nel contenitore quando viene effettivamente utilizzato.

Per soddisfare i requisiti che danno le garanzie di cui sopra, sarà probabilmente necessario utilizzare una forma di blocco esterno per i contenitori ad accesso simultaneo. Non so dei contenitori boost, ma se hanno un’interfaccia simile a quella dei container standard, sospetto che abbiano esattamente le stesse garanzie.

Le garanzie e i requisiti sono riportati in 17.6.4.10 [res.on.objects] paragrafo 1:

Il comportamento di un programma non è definito se le chiamate a funzioni di libreria standard da thread diversi possono introdurre una corsa di dati. Le condizioni in cui ciò può accadere sono specificate in 17.6.5.9. [Nota: la modifica di un object di un tipo di libreria standard condivisa tra thread rischia di comportare un comportamento indefinito a meno che gli oggetti di quel tipo non vengano esplicitamente specificati come condivisibili senza razze di dati o l’utente fornisca un meccanismo di blocco. -endnote]

… e 17.6.5.9 [res.on.data.races]. Questa sezione descrive in dettaglio la descrizione più informale nel no.

Ho più thread contemporaneamente chiamando push_back () su un object condiviso di std :: vector. Std :: vector thread safe?

Questo non è sicuro .

O devo implementare personalmente il meccanismo per renderlo sicuro?

Sì.

Voglio evitare di fare un lavoro extra di “blocco e liberazione” perché sono un utente della biblioteca piuttosto che un progettista di librerie. Spero di cercare soluzioni thread-safe esistenti per il vettore.

Bene, l’interfaccia del vettore non è ottimale per l’uso simultaneo. Va bene se il client ha accesso a un blocco, ma per l’interfaccia per il blocco astratto per ogni operazione – no. In effetti, l’interfaccia vettoriale non può garantire la sicurezza del thread senza un blocco esterno (presupponendo che siano necessarie operazioni anche mutanti).

Che ne dici di boost :: vector, che è stato introdotto di recente da boost 1.48.0 in poi. È thread-safe?

Stato dei documenti:

 //! boost::container::vector is similar to std::vector but it's compatible //! with shared memory and memory mapped files. 

Ho più thread contemporaneamente chiamando push_back () su un object condiviso di std :: vector. … Spero di cercare soluzioni thread-safe esistenti per il vettore.

Dai un’occhiata a concurrent_vector in TBB di Intel . A rigor di termini, è molto diverso da std::vector internamente e non è completamente compatibile con API, ma potrebbe comunque essere adatto. Potresti trovare alcuni dettagli del suo design e funzionalità nei blog degli sviluppatori TBB .