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:
lockje 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);
}