Middle+
Bir neçə iş parçaları (threads) və tapşırıqların (tasks) ümumi vəziyyətə müraciət etdiyi zaman necə işlənir?
sobes.tech Süni İntellekt
AI-dan cavab
Çox iş parçacığı mühitində ümumi vəziyyətə təhlükəsiz giriş üçün sinxronizasiya mexanizmləri istifadə olunur.
Əsas yanaşmalar:
- Bloklar:
lockən yaygın mexanizmdir. Bu, kod blokuna və ya obyektə bir vaxtda yalnız bir iş parçacığının girişini təmin edir. Mutex (qarşılıqlı istisna) də istifadə olunur, lakin çox vaxt proseslərarası qarşılıqlı əlaqədə. - Semantikalar: Eyni anda resursa giriş edə biləcək iş parçacığı sayını məhdudlaşdırır.
- Monitor:
lock-un daha güclü versiyasıdır və iş parçacqlarına digər iş parçacqlarından bildiriş gözləməyə imkan verir. - ReadWriteLock: Bir neçə iş parçacığının məlumatları eyni vaxtda oxumasına imkan verir, lakin yalnız bir iş parçacığı yazmağa icazə verir.
- Atomik əməliyyatlar: Sadə əməliyyatlar (inkrement, dekrement, müqayisə-əvəz) üçün
Interlockedsinifinin statik metodlarından istifadə etmək olar.
Task-lərlə işləyərkən, xüsusən async/await istifadə etdikdə, vəzifələrin müəyyən bir iş parçacığı ilə əlaqəli olmadığını unutmayın. Sinxronizasiya kontekstləri (SynchronizationContext) asinxron əməliyyat tamamlandıqdan sonra lazım olan kontekstə (məsələn, UI iş parçacığı) qayıtmağa kömək edir.
lock istifadə nümunəsi:
// Bloklama üçün obyekt
private readonly object _lockObject = new object();
private int _sharedCounter = 0;
public void IncrementCounter()
{
// Ümumi sayğacı bloklayır
lock (_lockObject)
{
_sharedCounter++;
}
}
Interlocked istifadə nümunəsi:
private int _sharedAtomicCounter = 0;
public void IncrementAtomicCounter()
{
// Atomik artım
Interlocked.Increment(ref _sharedAtomicCounter);
}