Middle+
Hogyan kezeljük a szálakkal (threads) és feladatokkal (tasks) való munkát, ha többük ugyanarra az állapotra hivatkozik?
sobes.tech MI
Válasz az MI-től
A több szálas környezetben a közös állapot biztonságos eléréséhez szinkronizációs mechanizmusokat alkalmaznak.
Fő megközelítések:
- Zárak: A
locka legelterjedtebb mechanizmus. Egy kódrészlet vagy objektum kizárólagos hozzáférését biztosítja egy szál számára egyszerre. Mutex (kölcsönös kizárás) szintén használatos, de gyakran folyamatok közötti kommunikációban. - Szemantika: Korlátozza, hogy hány szál férhet hozzá egy erőforráshoz egyidejűleg.
- Monitor: A
lock-nál erősebb változat, amely lehetővé teszi a szálak számára, hogy várakozzanak más szálak értesítésére. - ReadWriteLock: Több szál olvashatja az adatokat egyidejűleg, de csak egy írhat.
- Atomi műveletek: Egyszerű műveletekhez (inkrementálás, dekrementálás, összehasonlítás-csere) a
Interlockedosztály statikus metódusait lehet használni.
A feladatok (Tasks) kezelésénél, különösen az async/await használatakor, fontos megjegyezni, hogy a feladatok nem kötődnek egy adott szálhoz. A szinkronizációs kontextusok (SynchronizationContext) segítenek visszatérni a kívánt kontextusba (pl. UI szál) az aszinkron művelet befejezése után.
A lock példája:
// Záróobjektum
private readonly object _lockObject = new object();
private int _sharedCounter = 0;
public void IncrementCounter()
{
// A közös számláló zárolása
lock (_lockObject)
{
_sharedCounter++;
}
}
Az Interlocked példája:
private int _sharedAtomicCounter = 0;
public void IncrementAtomicCounter()
{
// Atomikus növelés
Interlocked.Increment(ref _sharedCounter);
}