Maison > développement back-end > C++ > Comment déplacer en toute sécurité les types C contenant « std :: mutex » ?

Comment déplacer en toute sécurité les types C contenant « std :: mutex » ?

Barbara Streisand
Libérer: 2024-11-30 08:11:10
original
821 Les gens l'ont consulté

How to Safely Move C   Types Containing `std::mutex`?

Gestion des mutex dans les types C mobiles

Présentation :

En C, la sémantique de déplacement est améliorée efficacité en permettant aux types d'être déplacés efficacement sans copie. Cependant, le mutex standard (std::mutex) n'est ni mobile ni copiable, ce qui pose un défi pour la mise en œuvre de types activés par le déplacement qui exploitent les mutex.

Problème :

Comment une classe (A) contenant un mutex peut-elle être rendue mobile dans un environnement thread-safe manière ?

Solution :

Pour activer la mobilité, définissez les types de verrous (ReadLock et WriteLock) comme alias pour les verrous partagés ou uniques. Utilisez ces types pour protéger les accès des membres dans les opérations liées au déplacement.

Constructeur de déplacement :

A(A&& a) {
    WriteLock rhs_lk(a.mut_);
    field1_ = std::move(a.field1_);
    field2_ = std::move(a.field2_);
}
Copier après la connexion

Opérateur d'affectation de déplacement :

A& operator=(A&& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        WriteLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = std::move(a.field1_);
        field2_ = std::move(a.field2_);
    }
    return *this;
}
Copier après la connexion

Copie Constructeur :

A(const A& a) {
    ReadLock rhs_lk(a.mut_);
    field1_ = a.field1_;
    field2_ = a.field2_;
}
Copier après la connexion

Opérateur d'affectation de copie :

A& operator=(const A& a) {
    if (this != &a) {
        WriteLock lhs_lk(mut_, std::defer_lock);
        ReadLock rhs_lk(a.mut_, std::defer_lock);
        std::lock(lhs_lk, rhs_lk);
        field1_ = a.field1_;
        field2_ = a.field2_;
    }
    return *this;
}
Copier après la connexion

Autres considérations :

  • Les membres de copie peuvent être optimisés en partageant un mutex en C 14.
  • Protéger les autres méthodes qui modifient l'état de A avec des mécanismes de verrouillage.
  • Protégez-vous contre l'auto-échange en vérifiant l'égalité avant l'échange.
  • Envisagez d'utiliser des membres de données de verrouillage en lecture et en écriture pour éviter la construction par défaut dans la copie/ déplacer les constructeurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal