Синхронизация потоков, различия
В чем различие между:
- lock (someobject) {}
- Использование Mutex
- Использование семафора
- Использование монитора
- Класс AutoResetEvent
- ReaderWriterLock
Ответы (1 шт):
Interlocked - если нужно атомарно изменить значение одной простой переменной.
lock - если нужно изменять сложные (составные) типы или множество простых.
Mutex - используется для межпроцессной коммуникации (в отличие от межпоточной).
Semaphore(Slim) - если нужно ограничить количество потоков, работающих одновременно с ресурсом.
ReaderWriterLock(Slim) - реализует стандартный паттерн "Один писатель - много читателей". Судя по многочисленны отзывам, страдает плохой производительностью, даже версия Slim. Устарел. В некоторых случаях его можно заменить на Task + pipeline.
Потокобезопасные коллекции из System.Collections.Concurrent - для безопасной работы с коллекциями объектов из нескольких потоков.
Кардинальное решение проблемы - переход на иммутабельные (неизменяемые) типы. В частности, коллекции System.Collections.Immutable. Нет разделяемых ресурсов - не нужна синхронизация.