Le code suivant contient un blocage potentiel, mais semble nécessaire: pour copier en toute sécurité les données dans un conteneur d'un autre, les deux conteneurs doivent être verrouillés pour empêcher les modifications dans un autre thread. Foo a un conteneur STL et "do copy" consiste essentiellement à utiliser std :: copy. Comment verrouiller les deux mutex sans introduire de blocage?Acquérir un verrou sur deux mutex et éviter les interblocages
Répondre
Impose une sorte de commande totale sur les instances de foo
et acquiert toujours leurs verrous dans l'ordre croissant ou décroissant, par exemple., foo1->lock()
puis foo2->lock()
.
Une autre approche consiste à utiliser une sémantique fonctionnelle et à écrire à la place une méthode foo::clone
qui crée une nouvelle instance plutôt que de tabasser une instance existante.
Si votre code effectue beaucoup de verrouillage, vous aurez peut-être besoin d'un algorithme complexe d'évitement de blocage, tel que le banker's algorithm.
Que pensez-vous de cela?
void foo::copy(const foo & rhs)
{
scopedLock lock(rhs.pMutex); // release mutex in destructor
foo tmp(rhs);
swap(tmp); // no throw swap locked internally
}
Ceci est une exception sûre, et assez bien sûr aussi. Pour être 100% thread, vous aurez besoin de revoir tout le chemin du code et de re-examiner à nouveau avec un autre ensemble d'yeux, après l'examiner à nouveau ...
Pour éviter une impasse, c'est probablement mieux, d'attendre jusqu'à à la fois les ressources peuvent être verrouillées:
ne sais pas quelle API mutex que vous utilisez est donc ici un code pseudo arbitraire, supposons que can_lock()
vérifie uniquement si elle peut verrouiller un mutex, et que try_lock()
renvoie true si elle a fait serrure, et faux , si le mutex est déjà verrouillé par quelqu'un d'autre.
void foo::copy(const foo & rhs)
{
for(;;)
{
if(! pMutex->cany_lock() || ! rhs.pMutex->cany_lock())
{
// Depending on your environment call or dont call sleep()
continue;
}
if(! pMutex->try_lock())
continue;
if(! rhs.pMutex->try_lock())
{
pMutex->try_lock()
continue;
}
break;
}
// do copy
}
Pour éviter un blocage, il est préférable d'introduire un livelock? Et tourner, en utilisant 100% CPU? – bk1e
Vous pouvez verrouiller les deux mutex en même temps en utilisant scoped_lock ou auto_lock .... comme faire le virement bancaire ...
void Transfer(Receiver recv, Sender send)
{
scoped_lock rlock(recv.mutex);
scoper_lock slock(send.mutex);
//do transaction.
}
- 1. n'a pas pu acquérir de verrou sur un composant
- 2. Pourquoi ne puis-je pas acquérir un verrou exclusif?
- 3. Python multiprocessing.Queue sur les interblocages PUT et obtenir
- 4. Certaines questions concernant les threads et les interblocages
- 5. Différence entre verrou (verrou) et verrouillage (variable_qui_utilise_I_am_using)
- 6. Comment puis-je implémenter cette commande pour éviter les interblocages avec LINQ to SQL?
- 7. Testez un verrou sans l'avoir acquis?
- 8. Les threads attendent-ils sur un verrou FIFO?
- 9. Libération automatique de mutex sur des plantages sous Unix
- 10. Comment supprimer un Mutex sur Windows XP
- 11. Comment éviter le défilement et acquérir toute la trame de UITextView dans l'iPhone?
- 12. Verrouillage permanent du mutex entraînant un blocage?
- 13. Présentation des interblocages avec les notifications de requêtes SQL Server
- 14. Verrous Mutex contre les verrous de filetage. Lequel utiliser?
- 15. C# mutex - appel d'erreur depuis ASP.NET et l'application console
- 16. boost :: mutex/Comment tester si un mutex est verrouillé
- 17. Détermination du processus qui a un verrou sur un fichier
- 18. Comment verrouiller un fichier et éviter les lectures pendant l'écriture
- 19. Déboguer un interblocage avec pthread mutex (linux)
- 20. Propriété statique et verrou Utilisation
- 21. Toutes les interblocages sont provoqués par une mauvaise requête
- 22. Mutex dans JNI utilisant Foundation NSLock
- 23. pthread_cond_wait ne déverrouille pas mutex
- 24. Comment acquérir un référentiel Git "nettoyé"?
- 25. comment acquérir un jeton d'authentification google
- 26. Diagnostic des interblocages dans le programme Win32
- 27. Mutex Stored Procédure
- 28. Détection d'un Mutex périmé
- 29. Verrou sur XDocument.Enregistrer pour plusieurs pages ASP.NET
- 30. utilisateur croisé C# mutex
Même quelque chose d'aussi simple que les adresses de ce contre rhs travaillerait. toujours verrouiller celui avec l'adresse inférieure en premier. –
clone ne fonctionnerait bien que s'il ne copiait pas, et je ne pense pas que le partage implicite fonctionnera, mais je vais jeter un coup d'oeil. Approche intéressante Kyle. Je ne peux pas voir les défauts. – pomeroy