Синхронизация потоков, различия

В чем различие между:

  • lock (someobject) {}
  • Использование Mutex
  • Использование семафора
  • Использование монитора
  • Класс AutoResetEvent
  • ReaderWriterLock

Ответы (1 шт):

Автор решения: Alexander Petrov

Interlocked - если нужно атомарно изменить значение одной простой переменной.

lock - если нужно изменять сложные (составные) типы или множество простых.

Mutex - используется для межпроцессной коммуникации (в отличие от межпоточной).

Semaphore(Slim) - если нужно ограничить количество потоков, работающих одновременно с ресурсом.

ReaderWriterLock(Slim) - реализует стандартный паттерн "Один писатель - много читателей". Судя по многочисленны отзывам, страдает плохой производительностью, даже версия Slim. Устарел. В некоторых случаях его можно заменить на Task + pipeline.

Потокобезопасные коллекции из System.Collections.Concurrent - для безопасной работы с коллекциями объектов из нескольких потоков.

Кардинальное решение проблемы - переход на иммутабельные (неизменяемые) типы. В частности, коллекции System.Collections.Immutable. Нет разделяемых ресурсов - не нужна синхронизация.

→ Ссылка