In diesem Artikel geht es darum, wie Sie mehr als eine Sperre gleichzeitig erhalten, wenn ein Multithread-Programm bereitgestellt wird, und die Deadlocks zu vermeiden.

Multithread-Programme - Aufgrund der Threads, die immer wieder versuchen, mehrere Sperren gleichzeitig zu erhalten, sind diese sehr anfällig für Deadlocks. Ein Beispiel: Eine Sperre wurde bereits von einem Thread erworben, und dann wird vom Block eine zweite Sperre versucht. In diesem Fall kann das Programm einfrieren, da der Thread möglicherweise den Fortschritt anderer Threads blockieren kann.

Lösung:

  • Durchsetzung der Bestellregel
  • Zuweisen jeder Sperre auf einzigartige Weise zum Programm.
  • Es können nur mehrere Sperren in aufsteigender Reihenfolge erfasst werden.

Code 1: Implementierung der Lösung mithilfe eines Kontextmanagers.

import threading 
from contextlib import contextmanager 
  
_local = threading.local() 
  
@contextmanager
def acquire(*lock_state_state): 
      
    
    lock_state_state = sorted(lock_state_state, key = lambda a: id(a)) 
      
    
    acquired = getattr(_local, 'acquired', []) 
    if acquired and max(id(lock_state) for 
                        lock_state in acquired) >= id(lock_state_state[0]): 
        raise RuntimeError('lock_state Order Violation') 
          
    
    acquired.extend(lock_state_state) 
    _local.acquired = acquired 
      
    try: 
    for lock_state in lock_state_state: 
        lock.acquire() 
    yield
    finally: 
          
        
        for lock_state in reversed(lock_state_state): 
            lock_state.release() 
        del acquired[-len(lock_state_state):]