Maison > développement back-end > C++ > Comment puis-je rendre mes classes C avec des mutex non mobiles à la fois mobiles et thread-safe ?

Comment puis-je rendre mes classes C avec des mutex non mobiles à la fois mobiles et thread-safe ?

Mary-Kate Olsen
Libérer: 2024-12-05 19:22:18
original
725 Les gens l'ont consulté

How Can I Make My C   Classes with Non-Movable Mutexes Both Movable and Thread-Safe?

Déplacement thread-safe avec des mutex non mobiles en C

Lorsqu'il s'agit de types mobiles, tels que std::mutex, en C la programmation thread-safe peut être difficile. Par défaut, std::mutex n'est ni mobile ni copiable, ce qui empêche la création d'objets mobiles thread-safe.

Pour rendre une classe contenant un mutex mobile et maintenir la sécurité des threads, envisagez l'approche suivante :

1. Activer la mutabilité :
Rendre le membre mutex mutable (par exemple, mutable std::mutex mut_;) pour permettre la modification lors des opérations de déplacement.

2. Move Constructor :
Verrouillez le mutex de l'objet à partir duquel vous êtes déplacé avant d'attribuer ses membres. Cela empêche la corruption des données lors d'un accès simultané.

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

3. Opérateur d'affectation de déplacement :
Protégez l'affectation de déplacement à l'aide de primitives de synchronisation. Étant donné que l'accès à partir de plusieurs threads est possible, verrouillez les mutex de gauche (lhs) et de droite (rhs) avant d'effectuer les affectations.

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

4. Membres de copie (facultatif) :
Si des membres de copie sont également requis, utilisez ReadLock (au lieu de WriteLock) pour autoriser la lecture simultanée à partir de l'objet à partir duquel la copie est effectuée.

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

5 . Considérations supplémentaires :

  • Protégez les autres fonctions membres et les fonctions libres accédant à l'état de la classe avec une synchronisation appropriée pour maintenir la sécurité des threads.
  • Envisagez d'utiliser std::shared_timed_mutex ou une autre synchronisation avancée tapez à optimiser pour des scénarios spécifiques dans C 14 et versions ultérieures.

En suivant ces directives, vous pouvez vous assurer que vos classes mobiles restent thread-safe même lorsque vous utilisez des mutex non mobiles.

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