Sobes.tech
Middle+

Kaip vykdoma darbo su srautais (threads) ir užduotimis (tasks), jei keli iš jų kreipiasi į bendrą būseną?

sobes.tech AI

Atsakymas iš AI

Daugiabriaunėje aplinkoje saugus bendrojo būsenos prieigos mechanizmas yra naudojami sinchronizacijos mechanizmai.

Pagrindiniai požiūriai:

  • Užraktai: lock yra dažniausiai naudojamas mechanizmas. Užtikrina išskirtinę prieigą prie kodo bloko arba objekto vienu metu vieno srauto. Mutex (tarpusavio išskyrimas) taip pat naudojamas, bet dažniau tarpsisteminėje sąveikoje.
  • Semantikos: riboja skaičių srautų, kurie gali vienu metu pasiekti išteklių.
  • Monitor: yra galingesnė lock versija, leidžianti srautams laukti kitų srautų pranešimų.
  • ReadWriteLock: leidžia keliems srautams vienu metu skaityti duomenis, bet tik vienam rašyti.
  • Atomines operacijos: paprastoms operacijoms (padidinimui, sumažinimui, palyginimui-keitimu) galima naudoti Interlocked klasės statines metodus.

Dirbant su užduotimis (Tasks), ypač naudojant async/await, svarbu prisiminti, kad užduotys nėra susietos su konkrečiu srautu. Sinchronizacijos kontekstai (SynchronizationContext) padeda grįžti į reikiamą kontekstą (pvz., UI srautą) po asinchroninės operacijos pabaigos.

lock pavyzdys:

// Užrakinimo objektas
private readonly object _lockObject = new object();
private int _sharedCounter = 0;

public void IncrementCounter()
{
    // Užrakiname bendrą skaitiklį
    lock (_lockObject)
    {
        _sharedCounter++;
    }
}

Interlocked pavyzdys:

private int _sharedAtomicCounter = 0;

public void IncrementAtomicCounter()
{
    // Atominis padidinimas
    Interlocked.Increment(ref _sharedCounter);
}