Sobes.tech
Junior — Middle

Cum se poate asigura o interacțiune corectă între fire în timpul executării sarcinilor paralele?

sobes.tech AI

Răspuns de la AI

Pentru o interacțiune corectă a firelor în timpul executării sarcinilor paralele în C#, se pot utiliza următoarele abordări:

  • Blocări (lock) — cuvântul cheie lock permite limitarea accesului la o secțiune critică a codului, astfel încât doar un fir să o poată executa simultan.

  • Mutex și Semaphore — mecanisme de sincronizare mai flexibile, care pot fi utilizate pentru gestionarea accesului la resurse între fire sau procese.

  • Monitor — o clasă care oferă metode pentru blocare și așteptare, similar cu lock, dar cu un control mai mare.

  • Colecții concurente — de exemplu, ConcurrentDictionary, ConcurrentQueue etc., care sunt sigure pentru accesul multi-thread fără sincronizare suplimentară.

  • Interlocked — clasă pentru operații atomice asupra variabilelor (de exemplu, incrementare, decrementare).

  • async/await și Task Parallel Library (TPL) — permit scrierea de cod asincron și paralel, minimizând problemele de sincronizare.

Exemplu de utilizare a lock:

private readonly object _locker = new object();
private int _counter = 0;

public void Increment()
{
    lock (_locker)
    {
        _counter++;
    }
}

Această abordare garantează că, în cazul apelurilor paralele ale metodei Increment, valoarea _counter va fi incrementată corect, fără condiții de cursă.