std:: atomic_... <std::shared_ptr>
|
Défini dans l'en-tête
<memory>
|
||
|
template
<
class
T
>
bool atomic_is_lock_free ( const std:: shared_ptr < T > * p ) ; |
(1) |
(depuis C++11)
(déprécié en C++20) (supprimé en C++26) |
|
template
<
class
T
>
std:: shared_ptr < T > atomic_load ( const std:: shared_ptr < T > * p ) ; |
(2) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
std::
shared_ptr
<
T
>
atomic_load_explicit
|
(3) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
void atomic_store ( std:: shared_ptr < T > * p, std:: shared_ptr < T > r ) ; |
(4) |
(depuis C++11)
(déprécié en C++20) (supprimé en C++26) |
|
template
<
class
T
>
void
atomic_store_explicit
|
(5) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
std::
shared_ptr
<
T
>
atomic_exchange
|
(6) |
(depuis C++11)
(déprécié en C++20) (supprimé en C++26) |
|
template
<
class
T
>
std::
shared_ptr
<
T
>
atomic_exchange_explicit
|
(7) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
bool
atomic_compare_exchange_weak
|
(8) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
bool
atomic_compare_exchange_strong
|
(9) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
bool
atomic_compare_exchange_strong_explicit
|
(10) |
(depuis C++11)
(obsolète en C++20) (supprimé en C++26) |
|
template
<
class
T
>
bool
atomic_compare_exchange_weak_explicit
|
(11) |
(depuis C++11)
(déprécié en C++20) (supprimé en C++26) |
Si plusieurs threads d'exécution accèdent au même
std::shared_ptr
objet sans synchronisation et que l'un de ces accès utilise une fonction membre non constante de
shared_ptr
alors une course aux données se produira, sauf si tous ces accès sont effectués via ces fonctions, qui sont des surcharges des fonctions d'accès atomique correspondantes (
std::atomic_load
,
std::atomic_store
, etc.).
Notez que le bloc de contrôle d'un
shared_ptr
est thread-safe : différents objets
std::shared_ptr
peuvent être accédés en utilisant des opérations modifiables, telles que
operator
=
ou
reset
, simultanément par plusieurs threads, même lorsque ces instances sont des copies et partagent le même bloc de contrôle en interne.
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst ) .
( p, expected, desired, std:: memory_order_seq_cst ,
std:: memory_order_seq_cst ) .
- S'ils sont équivalents (stockent la même valeur de pointeur, et partent soit la propriété du même objet ou sont tous deux vides), assigne desired dans * p en utilisant les contraintes d'ordonnancement de mémoire spécifiées par success et retourne true .
- S'ils ne sont pas équivalents, assigne * p dans * expected en utilisant les contraintes d'ordonnancement de mémoire spécifiées par failure et retourne false .
atomic_compare_exchange_weak_explicit
peut échouer de manière sporadique.
Si p est un pointeur nul, le comportement de ces fonctions est indéfini.
Table des matières |
Paramètres
| p, attendu | - | un pointeur vers un std::shared_ptr |
| r, souhaité | - | un std::shared_ptr |
| mo, succès, échec | - | sélecteurs d'ordre mémoire de type std::memory_order |
Exceptions
Ces fonctions ne lèvent pas d'exceptions.
Valeur de retour
Notes
Ces fonctions sont généralement implémentées à l'aide de mutex, stockés dans une table de hachage globale où la valeur du pointeur est utilisée comme clé.
Le
Concurrency TS
propose les classes de pointeurs intelligents atomiques
atomic_shared_ptr
et
atomic_weak_ptr
comme remplacement à l'utilisation de ces fonctions.
|
Ces fonctions ont été dépréciées en faveur des spécialisations du modèle std::atomic : std:: atomic < std:: shared_ptr > et std:: atomic < std:: weak_ptr > . |
(depuis C++20)
(jusqu'à C++26) |
|
Ces fonctions ont été supprimées en faveur des spécialisations du modèle std::atomic : std:: atomic < std:: shared_ptr > et std:: atomic < std:: weak_ptr > . |
(depuis C++26) |
Exemple
|
Cette section est incomplète
Raison : aucun exemple |
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 2172 | C++11 | expected pouvait être un pointeur nul | le comportement est indéfini dans ce cas |
| LWG 2980 | C++11 |
les
shared_ptr
vides n'étaient jamais équivalents
|
équivalents s'ils stockent la même valeur de pointeur |
Voir aussi
|
(C++11)
|
vérifie si les opérations du type atomique sont sans verrouillage
(modèle de fonction) |
|
(C++11)
(C++11)
|
remplace atomiquement la valeur de l'objet atomique par un argument non atomique
(modèle de fonction) |
|
(C++11)
(C++11)
|
obtient atomiquement la valeur stockée dans un objet atomique
(modèle de fonction) |
|
(C++11)
(C++11)
|
remplace atomiquement la valeur de l'objet atomique par un argument non atomique et retourne l'ancienne valeur de l'atomique
(modèle de fonction) |
|
compare atomiquement la valeur de l'objet atomique avec un argument non atomique et effectue un échange atomique si égal ou un chargement atomique sinon
(modèle de fonction) |