Страницы

Поиск по вопросам

понедельник, 19 ноября 2018 г.

Синхронизация межпроцесcного доступа к коду C#

Здравствуйте, просматривал такие понятия как Mutex, Semaphore, SemaphoreSlim, AutoResentEvent и т.д. В ходе разбирательств с ними возникли вот такие вопросы: 1) Если не дать Mutex имя, получается, что он начинает работать как обычный lock делать синхронизацию между потоками на уровне одного процесса, а межпроцессная синхронизация пропадает? То есть в таком случаи он ни чем не отличается от lock? 2) Вопрос похожий на предыдущий, Semaphore без задания имени он превращается в обычный loc только с поддержкой синхронизации нескольких потоков, хорошо, здесь понятно. Тогда получается от SemaphoreSlim он отличается лишь более сложным созданием т.к Semaphore(без имени) создается на уровне ядра и как следствие(из-за отсутствия имени) работает только для одного процесса(т.е толку от того, что он создается на уровни ядра никакого). Вот и получается, что SemaphoreSlim и Semaphore(без имени) буду работать одинаково, разве, что первый чуть быстрее. Правильно я понимаю расклад? Или же есть какое-то различие?


Ответ

Да, по смыслу неименованный Mutex — практически то же самое, что и блокировка через lock. Разница состоит в том, что
lock не работает через границы AppDomain'а, а неименованный Mutex доступен во всём процессе. Mutex является WaitHandle'ом, то есть вы можете, например, дожидаться его с таймаутом или ждать блокировки одного из нескольких Mutex'ов. lock реализован эффективнее, чем Mutex Разница между Semaphore и SemaphoreSlim примерно та же. Semaphore — обёртка над объектом Win32. SemaphoreSlim существенно быстрее, но он работает только внутри процесса и не экспортирует WaitHandle

Комментариев нет:

Отправить комментарий