Quelle est la meilleure approche pour atteindre la sécurité des threads pour des opérations plutôt simples?Devrais-je protéger les opérations sur les types primitifs avec des mutex pour être thread-safe en C++?
Tenir compte d'une paire de fonctions:
void setVal(int val)
{
this->_val = val;
}
int getVal() {
return this->_val;
}
Étant donné que même les affectations de types primitifs ne sont pas garantis atomiques, dois-je modifier tous les getter et setter dans le programme de la manière suivante pour être thread-safe ?
void setVal(int val)
{
this->_mutex.lock();
this->_val = val;
this->_mutex.unlock();
}
int getVal() {
this->_mutex.lock();
int result = this->_val;
this->_mutex.unlock();
return result;
}
Notez qu'en général, pour la sécurité des exceptions et la clarté du code, il est préférable d'utiliser un 'scoped_lock' d'une sorte que de verrouiller et déverrouiller manuellement le mutex. –
@James: Je suis assez novice avec des aspects pratiques ... est-il nécessaire de copier à un temporaire et de le renvoyer plutôt que de revenir directement ici? (ce qui nécessiterait un verrou de portée) Je suppose que la plupart des implémentations de compilateurs appliqueraient NRVO et donc cela n'aurait pas d'importance, mais je trouve que le 'résultat' est faux. –
@Matthieu: Si vous utilisez un 'scoped_lock' vous pouvez simplement' return this -> _ val'. Si vous utilisez le verrouillage et le déverrouillage manuels, vous n'avez pas beaucoup de choix (sauf si vous aimez les blocages :-P). –