Ho un parent e un thread di lavoro che condividono un flag bool e un vettore std ::. Il genitore legge solo (ad esempio, legge il bool o chiama my_vector.empty()); l'operaio scrive soloUn lettore. Uno scrittore. Alcune domande di carattere generale sui mutex e sui buildin atomici
Le mie domande:
Devo mutex proteggere la bandiera bool?
Posso dire che tutte le letture/scritture bool sono operazioni intrinsecamente atomiche? Se dici Sì o No, da dove hai preso le tue informazioni?
Recentemente ho sentito parlare di GCC Atomic-builtin. Posso usarli per rendere il mio flag in lettura/scrittura atomico senza dover usare i mutex? Qual è la differenza? Capisco che i builtin di Atomic si riducono al codice macchina, ma anche i mutex si riducono alle istruzioni della barriera di memoria della CPU, giusto? Perché le persone chiamano mutex un costrutto "OS-level"?
Ho bisogno di mutex proteggere il mio std :: vector? Ricordiamo che il thread operaio popola questo vettore, mentre il genitore chiama solo vuoto() su di esso (cioè lo legge solo)
Non credo che la protezione di mutex sia necessaria per il bool o per il vettore. Razionalizzo come segue, "Ok, se leggo la memoria condivisa poco prima che fosse aggiornata ... è ancora valido, avrò il valore aggiornato la prossima volta. Ancora più importante, non vedo perché lo scrittore debba essere bloccato mentre la lettura sta leggendo, perché dopotutto, il lettore sta solo leggendo! "
Se qualcuno può indicarmi la giusta direzione, sarebbe fantastico. Sono su GCC 4.3 e Intel x86 a 32 bit. Grazie mille!
Per quanto riguarda il 'bool', ha certamente bisogno di qualcosa per garantire che l'accesso abbia effettivamente luogo quando pensa di farlo. Se ha un compilatore che supporta 'std :: atomic <>', allora dovrebbe essere sufficiente; in caso contrario, ha bisogno di una sorta di meccanismo di sincronizzazione o di altri mezzi per garantire che siano presenti le necessarie recinzioni, ecc. –
Si noti inoltre che 'std :: vector' potrebbe spostare il suo contenuto da sotto i piedi quando è necessario riassegnarlo per un buffer più grande. A questo punto il consumatore potrebbe leggere 'cancella' la memoria. –
@Maxim: Ho bisogno di un chiarimento per favore, secondo le operazioni manuali di Intel sui bool sono intrinsecamente atomici, eppure nella tua prima risposta dici che "un'istruzione atomica farebbe". Sei contraddittorio? Oppure, stai dicendo che dovrei essere dalla parte della sicurezza e utilizzare un built-in atomico in caso il mio codice venga eseguito su un sistema non Intel? – Kostolma