Maison développement back-end Tutoriel Python python多线程编程4: 死锁和可重入锁

python多线程编程4: 死锁和可重入锁

Oct 18, 2016 am 11:31 AM
多线程 编程

死锁

在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:

# encoding: UTF-8
import threading
import time
  
class MyThread(threading.Thread):
    def do1(self):
        global resA, resB
        if mutexA.acquire():
             msg = self.name+' got resA'
             print msg
               
             if mutexB.acquire(1):
                 msg = self.name+' got resB'
                 print msg
                 mutexB.release()
             mutexA.release()
    def do2(self):
        global resA, resB
        if mutexB.acquire():
             msg = self.name+' got resB'
             print msg
               
             if mutexA.acquire(1):
                 msg = self.name+' got resA'
                 print msg
                 mutexA.release()
             mutexB.release()
   
      
    def run(self):
        self.do1()
        self.do2()
resA = 0
resB = 0
  
mutexA = threading.Lock()
mutexB = threading.Lock()
  
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == '__main__':
    test()
Copier après la connexion

执行结果:


Thread-1 got resA

Thread-1 got resB

Thread-1 got resB

Thread-1 got resA

Thread-2 got resA

Thread-2 got resB

Thread-2 got resB

Thread-2 got resA

Thread-3 got resA

Thread-3 got resB

Thread-3 got resB

Thread-3 got resA

Thread-5 got resA

Thread-5 got resB

Thread-5 got resB

Thread-4 got resA


此时进程已经死掉。


可重入锁

更简单的死锁情况是一个线程“迭代”请求同一个资源,直接就会造成死锁:

import threading
import time
  
class MyThread(threading.Thread):
    def run(self):
        global num
        time.sleep(1)
  
        if mutex.acquire(1): 
            num = num+1
            msg = self.name+' set num to '+str(num)
            print msg
            mutex.acquire()
            mutex.release()
            mutex.release()
num = 0
mutex = threading.Lock()
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == '__main__':
    test()
Copier après la connexion

为了支持在同一线程中多次请求同一资源,python提供了“可重入锁”:threading.RLock。RLock内部维护着一个Lock和一个counter变量,counter记录了acquire的次数,从而使得资源可以被多次require。直到一个线程所有的acquire都被release,其他的线程才能获得资源。上面的例子如果使用RLock代替Lock,则不会发生死锁:

import threading
import time
  
class MyThread(threading.Thread):
    def run(self):
        global num
        time.sleep(1)
  
        if mutex.acquire(1): 
            num = num+1
            msg = self.name+' set num to '+str(num)
            print msg
            mutex.acquire()
            mutex.release()
            mutex.release()
num = 0
mutex = threading.RLock()
def test():
    for i in range(5):
        t = MyThread()
        t.start()
if __name__ == '__main__':
    test()
Copier après la connexion

执行结果:


Thread-1 set num to 1

Thread-3 set num to 2

Thread-2 set num to 3

Thread-5 set num to 4

Thread-4 set num to 5


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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment gérer les ressources partagées en multi-threading en C++ ? Comment gérer les ressources partagées en multi-threading en C++ ? Jun 03, 2024 am 10:28 AM

Les mutex sont utilisés en C++ pour gérer des ressources partagées multithread : créez des mutex via std::mutex. Utilisez mtx.lock() pour obtenir un mutex et fournir un accès exclusif aux ressources partagées. Utilisez mtx.unlock() pour libérer le mutex.

Défis et stratégies pour tester les programmes multithread en C++ Défis et stratégies pour tester les programmes multithread en C++ May 31, 2024 pm 06:34 PM

Les tests de programmes multithread sont confrontés à des défis tels que la non-répétabilité, les erreurs de concurrence, les blocages et le manque de visibilité. Les stratégies incluent : Tests unitaires : écrivez des tests unitaires pour chaque thread afin de vérifier le comportement du thread. Simulation multithread : utilisez un framework de simulation pour tester votre programme en contrôlant la planification des threads. Détection de courses aux données : utilisez des outils pour trouver des courses aux données potentielles, tels que valgrind. Débogage : utilisez un débogueur (tel que gdb) pour examiner l'état du programme d'exécution et trouver la source de la course aux données.

Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Défis et contre-mesures de la gestion de la mémoire C++ dans un environnement multithread ? Jun 05, 2024 pm 01:08 PM

Dans un environnement multithread, la gestion de la mémoire C++ est confrontée aux défis suivants : courses de données, blocages et fuites de mémoire. Les contre-mesures incluent : 1. L'utilisation de mécanismes de synchronisation, tels que les mutex et les variables atomiques ; 2. L'utilisation de structures de données sans verrouillage ; 3. L'utilisation de pointeurs intelligents ; 4. (Facultatif) La mise en œuvre du garbage collection ;

Techniques de débogage et de dépannage dans la programmation multithread C++ Techniques de débogage et de dépannage dans la programmation multithread C++ Jun 03, 2024 pm 01:35 PM

Les techniques de débogage pour la programmation multithread C++ incluent l'utilisation d'un analyseur de course aux données pour détecter les conflits de lecture et d'écriture et l'utilisation de mécanismes de synchronisation (tels que les verrous mutex) pour les résoudre. Utilisez des outils de débogage de threads pour détecter les blocages et les résoudre en évitant les verrous imbriqués et en utilisant des mécanismes de détection des blocages. Utilisez Data Race Analyser pour détecter les courses de données et les résoudre en déplaçant les opérations d'écriture dans des sections critiques ou en utilisant des opérations atomiques. Utilisez des outils d'analyse des performances pour mesurer la fréquence des changements de contexte et résoudre les surcharges excessives en réduisant le nombre de threads, en utilisant des pools de threads et en déchargeant les tâches.

Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Résolution de problèmes avec Python : débloquez des solutions puissantes en tant que codeur débutant Oct 11, 2024 pm 08:58 PM

Python permet aux débutants de résoudre des problèmes. Sa syntaxe conviviale, sa bibliothèque complète et ses fonctionnalités telles que les variables, les instructions conditionnelles et les boucles permettent un développement de code efficace. De la gestion des données au contrôle du flux du programme et à l'exécution de tâches répétitives, Python fournit

Collection d'énigmes de programmation C++ : stimule la réflexion et améliore les compétences en programmation Collection d'énigmes de programmation C++ : stimule la réflexion et améliore les compétences en programmation Jun 01, 2024 pm 10:26 PM

Les énigmes de programmation C++ couvrent les concepts d'algorithme et de structure de données tels que la séquence de Fibonacci, la factorielle, la distance de Hamming, les valeurs maximales et minimales des tableaux, etc. En résolvant ces énigmes, vous pouvez consolider vos connaissances en C++ et améliorer la compréhension des algorithmes et vos compétences en programmation.

Le concept clé de la programmation multithread C++ est de savoir comment synchroniser les threads ? Le concept clé de la programmation multithread C++ est de savoir comment synchroniser les threads ? Jun 03, 2024 am 11:55 AM

Concepts clés de la synchronisation multithread C++ : Verrouillage mutex : assurez-vous que la section critique n'est accessible que par un seul thread. Variables de condition : les threads peuvent être réveillés lorsque des conditions spécifiques sont remplies. Fonctionnement atomique : une seule instruction CPU ininterruptible garantit l’atomicité des modifications de variables partagées.

Mécanisme de prévention et de détection des blocages dans la programmation multithread C++ Mécanisme de prévention et de détection des blocages dans la programmation multithread C++ Jun 01, 2024 pm 08:32 PM

Le mécanisme de prévention des blocages multithread comprend : 1. Séquence de verrouillage ; 2. Test et configuration. Le mécanisme de détection comprend : 1. Timeout ; 2. Détecteur de blocage. L'article prend l'exemple d'un compte bancaire partagé et évite les blocages grâce à une séquence de verrouillage. La fonction de transfert demande d'abord le verrouillage du compte de transfert sortant, puis le transfert du compte entrant.

See all articles