Sobes.tech
Middle+

Kako se radi sa nitima (threads) i zadacima (tasks) kada više njih pristupa zajedničkom stanju?

sobes.tech АИ

Одговор од АИ

Za siguran pristup zajedničkom stanju u višestrukom niti okruženju koriste se mehanizmi sinhronizacije.

Glavni pristupi:

  • Zaključavanja: lock je najrašireniji mehanizam. Osigurava ekskluzivan pristup delu koda ili objektu za jednu nit odjednom. Mutex (međusobno isključivanje) se takođe koristi, ali često u komunikaciji između procesa.
  • Semantike: Ograničavaju broj niti koje mogu istovremeno pristupiti resursu.
  • Monitor: Predstavlja snažniji analog lock, koji omogućava nitima da čekaju obaveštenja od drugih niti.
  • ReadWriteLock: Omogućava više niti da čitaju podatke istovremeno, ali samo jedna da piše.
  • Atomarne operacije: Za jednostavne operacije (inkrement, dekrement, poređenje-zamena) mogu se koristiti statičke metode klase Interlocked.

Prilikom rada sa zadacima (Tasks), posebno sa async/await, važno je zapamtiti da zadaci nisu vezani za određenu nit. Konteksti sinhronizacije (SynchronizationContext) pomažu da se vrate u željeni kontekst (npr. UI nit) nakon završetka asinhrone operacije.

Primer korišćenja lock:

// Objekat za zaključavanje
private readonly object _lockObject = new object();
private int _sharedCounter = 0;

public void IncrementCounter()
{
    // Zaključava pristup zajedničkom brojaču
    lock (_lockObject)
    {
        _sharedCounter++;
    }
}

Primer korišćenja Interlocked:

private int _sharedAtomicCounter = 0;

public void IncrementAtomicCounter()
{
    // Atomarno povećanje
    Interlocked.Increment(ref _sharedCounter);
}