Sobes.tech
Middle

Ce este o stare de blocare?

sobes.tech AI

Răspuns de la AI

Condiția de blocare (lock contention) apare atunci când mai multe fire de execuție sau procese încearcă simultan să obțină acces exclusiv la o resursă comună (de exemplu, o variabilă, un fișier sau o blocare), protejată de un mecanism de blocare. Acest lucru duce la suspendarea unora dintre ele și așteptarea eliberării resursei.

Cauze principale:

  • Multithreading/multiprocesare.
  • Resurse partajate modificabile.
  • Utilizarea nesănătoasă a blocărilor (blocări prea lungi sau granulare).

Consecințe:

  • Scăderea performanței din cauza așteptării.
  • Creșterea costurilor de gestionare a blocărilor.
  • Posibile deadlock-uri (blocaje) în cazul utilizării incorecte.

Modalități de minimizare:

  • Reducerea timpului în care resursa este blocată.
  • Utilizarea unor blocări mai granulare (blocarea doar a părții necesare a resursei).
  • Aplicarea operațiilor atomice, dacă este posibil.
  • Utilizarea structurilor de date fără blocare.
  • Scalare orizontală, dacă arhitectura permite.

Exemplu de cod Python care demonstrează competiția pentru o blocare:

import threading
import time

lock = threading.Lock()
contor = 0

def increment():
    global contor
    # Achiziționarea blocării
    lock.acquire()
    try:
        # Simulare de lucru
        time.sleep(0.01)
        contor += 1
    finally:
        # Eliberarea blocării
        lock.release()

threaduri = []
for _ in range(10):
    t = threading.Thread(target=increment)  # Crearea firelor pentru incrementare
    threaduri.append(t)
    t.start()  # Pornirea firelor

for t in threaduri:
    t.join()  # Așteptarea finalizării tuturor firelor

print(f"Valoarea finală a contorului: {contor}")

Aici, lock.acquire() și lock.release() protejează accesul la contor. Fără blocare (sau în condiții de concurență), valoarea finală ar putea fi mai mică decât 10 din cauza condițiilor de cursă (race conditions).