Middle+
Как се работи с потоци (threads) и задачи (tasks), ако няколко от тях се обръщат към общо състояние?
sobes.tech AI
Отговор от AI
За безопасен достъп до споделеното състояние в многопоточна среда се използват механизми за синхронизация.
Основни подходи:
- Блокировки:
lockе най-разпространеният механизъм. Осигурява монополен достъп до блок от код или обект за един поток наведнъж. Mutex (взаимно изключване) също се използва, но често при междупроцесна комуникация. - Семантики: Ограничават броя на потоковете, които могат едновременно да получат достъп до ресурс.
- Monitor: Представлява по-мощен аналог на
lock, който позволява на потоковете да чакат уведомления от други потоци. - ReadWriteLock: Позволява на множество потоци да четат данни едновременно, но само на един да пише.
- Атомарни операции: За прости операции (инкремент, декремент, сравнение-обмен) могат да се използват статични методи на класа
Interlocked.
При работа с задачи (Tasks), особено с async/await, е важно да се помни, че задачите не са свързани с конкретен поток. Контекстите за синхронизация (SynchronizationContext) помагат да се върнете към необходимия контекст (например, UI поток) след приключване на асинхронната операция.
Пример за използване на lock:
// Обект за блокиране
private readonly object _lockObject = new object();
private int _sharedCounter = 0;
public void IncrementCounter()
{
// Блокиране на достъпа до споделения брояч
lock (_lockObject)
{
_sharedCounter++;
}
}
Пример за използване на Interlocked:
private int _sharedAtomicCounter = 0;
public void IncrementAtomicCounter()
{
// Атомично увеличение
Interlocked.Increment(ref _sharedCounter);
}