Dois-je appeler atomique load/store explicitement?
C++11 introduit la std::atomic<>
la bibliothèque de modèles. La norme spécifie les store()
et load()
opérations de atomiquement set /get une variable partagée par plus d'un thread.
Ma question est: est-cession d'accès et les opérations atomiques?
À savoir:
std::atomic<bool> stop(false);
...
void thread_1_run_until_stopped()
{
if(!stop.load())
/* do stuff */
}
void thread_2_set_stop()
{
stop.store(true);
}
Équivalent à:
void thread_1_run_until_stopped()
{
if(!stop)
/* do stuff */
}
void thread_2_set_stop()
{
stop = true;
}
stop.load(std::memory_order_relaxed)
etstop.store(true, std::memory_order_relaxed);
doit être bien ici, comme le dit Serge. Vous avez juste besoin de la banque pour être vu rapidement, etrelaxed
garantit que. Vous avez seulement besoin d'un plus fort de la commande si vous avez besoin de synchroniser d'autres données.
Vous devez vous connecter pour publier un commentaire.
Oui, ils sont.
atomic<T>::operator T
etatomic<T>::operator=
sont équivalentes àatomic<T>::load
etatomic<T>::store
respectivement. Tous les opérateurs sont mis en œuvre dans le atomique en classe tels qu'ils pourront utiliser des opérations atomiques comme vous le souhaitez.Je ne suis pas sûr de ce que tu veux dire à propos de la "non-référence" types? Pas sûr de savoir comment les types de référence sont pertinentes en l'espèce.
std::memory_order_seq_cst
. Cela empêche de se tirer une balle dans le pied, mais il est sans doute prématuré pessimization.Vous pouvez faire les deux, mais l'avantage de
load()
/store()
est qu'ils permettent de spécifier la mémoire de l'ordre. Il est important parfois de la performance, où vous pouvez spécifierstd::memory_order_relaxed
toutatomic<T>::operator T
etatomic<T>::operator=
serait l'utilisation la plus sûre et lentestd::memory_order_seq_cst
. Il est parfois important pour l'exactitude et la lisibilité de votre code: bien que la valeur par défautstd::memory_order_seq_cst
est le plus sûr donc les plus susceptibles d'être correct, il n'est pas immédiatement clair pour le lecteur de ce genre d'opération (acquisition/diffusion/consommer) vous faites, ou si vous effectuez cette opération à tous (pour répondre: n'est-ce pas détendue afin suffisant ici?).