Ho un programma C++ 11 che esegue alcuni calcoli e utilizza uno std::unordered_map
per memorizzare nella cache i risultati di tali calcoli. Il programma utilizza più thread e utilizza uno spazio condiviso unordered_map
per archiviare e condividere i risultati dei calcoli.Data race con std :: unordered_map, nonostante gli inserimenti di blocco con mutex
In base alla mia lettura dei unordered_map
e container STL specifiche, così come unordered_map thread safety, sembra che un unordered_map
, condiviso da più thread, in grado di gestire una scrittura thread alla volta, ma molti lettori alla volta.
Pertanto, sto utilizzando un std::mutex
per avvolgere le mie chiamate insert()
sulla mappa, in modo che al massimo venga inserito solo un thread alla volta.
Tuttavia, le mie chiamate find()
non hanno un mutex come, dalla mia lettura, sembra che molti thread dovrebbero essere in grado di leggere contemporaneamente. Tuttavia, di tanto in tanto ricevo dati sulle gare (come rilevato da TSAN), manifestandosi in un SEGV. La corsa dei dati indica chiaramente le chiamate insert()
e find()
che ho menzionato sopra.
Quando avvolgo le chiamate find()
in un mutex, il problema scompare. Tuttavia, non desidero serializzare le letture simultanee, poiché sto cercando di rendere questo programma il più veloce possibile. (FYI: Sto utilizzando gcc 5.4.)
Perché sta succedendo? La mia comprensione delle garanzie di concorrenza di std::unordered_map
non è corretta?
Sembra che tu abbia bisogno di un 'shared_mutex' poiché tutte le chiamate in scrittura e lettura necessitano di sincronizzazione poiché hai uno scrittore. – NathanOliver
La risposta nel thread collegato lo dice: "* A. Più thread contemporaneamente, * ** o ** * B. Scrittura di un thread allo stesso tempo *". Nota il ** o **. – Pixelchemist
Hai erroneamente interpretato la specifica; consente più lettori, ma non più lettori indipendentemente dal singolo autore. Hai bisogno di un blocco di Reader/Single Writer multipli come il shared_mutex menzionato nel commento di NathanOliver – antlersoft