Est-il possible avec std :: atomic de transformer une fonction membre complexe d’une classe atomique?

Est-il possible de faire quelque chose comme ça?

... class test{ int i; public: test(int k):i(k){}; void my(){ cout<<i; } } atomic kk(0); kk.test(); ... 

Si ce n’est pas possible alors comment faire un appel de fonction pour qu’il soit atomique?

La façon dont fonctionne std::atomic est qu’il utilise certaines instructions fournies par le processeur. Ces instructions ne sont disponibles que pour des nombres entiers de certaines tailles (différents processeurs ont des limites et des règles différentes sur ce que vous pouvez ou ne pouvez pas faire. Dans certaines architectures, l’architecture du processeur peut même nécessiter l’utilisation d’un mutex ou de fonctionnalités similaires pour la mise en oeuvre. std :: atomic).

Notez également que l’objective de std::atomic est utilisé pour garantir que la valeur est mise à jour de manière atomique sur plusieurs cœurs de processeur ou plusieurs processeurs, ce qui n’est généralement pas ce que vous voulez / pouvez faire avec des structures de données plus grandes.

Pour réaliser des opérations atomiques sur d’autres structures de données, vous devrez utiliser des constructions mutex ou similaires afin de vous assurer que le traitement est effectué de manière “thread atomique” (différente de “processeur atomique”).

Vous pouvez créer std::atomic objects std::atomic objects non numériques. La principale ressortingction est que le type contenu doit être copiable de manière sortingviale; En gros (parce que c’est ainsi que c’est implémenté), cela signifie que copier avec memcpy est correct et que comparer avec memcmp est utile. Cependant, cela ne vous permet pas d’appeler des fonctions membres sur l’object stocké. Vous devez copier l’object stocké, effectuer la mise à jour, puis copier le résultat dans l’object atomique.