Sobes.tech
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);
}