Страницы

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

понедельник, 23 декабря 2019 г.

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

#c_sharp


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


Ответы

Ответ 1



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

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

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