È il mutex davvero solo proteggere un singolo int
? Fa la differenza: se si tratta di un tipo di dati più complesso, è assolutamente necessario il blocco.
Ma se è solo un int
, e si è certi che int
è un tipo atomico (cioè, il processore non ha a che fare due memoria separata legge per caricare l'int in un registro), e vi hanno benchmark del prestazioni e determinato che hai bisogno di prestazioni migliori, quindi potresti prendere in considerazione la possibilità di rilasciare il blocco sia dal getter che dal setter. Se lo fai, assicurati di qualificare lo int
come volatile
. E scrivi un commento che spiega perché non hai la protezione mutex e in quali condizioni ti occorrerebbe se la classe cambi.
Inoltre, fate attenzione che non si dispone di codice come questo:
void func(foo &f) {
int temp = f.count();
++temp;
f.setCount(temp);
}
che non è threadsafe, indipendentemente dal fatto che si utilizza un mutex o meno. Se è necessario fare qualcosa del genere, la protezione mutex deve essere al di fuori delle funzioni setter/getter.
Non necessariamente. Leggere e scrivere un 'int' sono probabilmente operazioni atomiche. Naturalmente questo dipende dall'architettura e non è portatile. – Dan
Esattamente - è un comportamento indefinito. È meglio avere l'overhead minuto di un lucchetto, in contrasto con la memoria corrotta. –
Di solito, sì.Ma se hai una comprovata necessità di aumentare le prestazioni, potrebbe essere possibile omettere il blocco. Vedi la mia risposta. – Dan