Что такое семафор?
Статья Mutexes and Semaphores Demystified Майкла Барра — отличное semaphores краткое введение в то, что threading отличает мьютексы и семафоры, и multithreading когда их следует и не следует thread использовать. Здесь я выделил threading несколько ключевых абзацев.
Ключевым threads моментом является то, что semaphore мьютексы должны использоваться concurrency-violation для защиты общих ресурсов, а multithread семафоры должны использоваться concurrent-programming для сигнализации. Как правило, вы threading не должны использовать семафоры concurrent для защиты общих ресурсов thread или мьютексы для передачи concurrent сигналов. Например, есть concurrency-violation проблемы с аналогией с вышибалой concurency с точки зрения использования threads семафоров для защиты общих threads ресурсов — вы можете использовать multithread их таким образом, но это thread может затруднить диагностику concurrency ошибок.
Хотя мьютексы и семафоры concurrent имеют некоторое сходство concurrent в своей реализации, их всегда threads следует использовать по-разному.
Самый concurrency-violation распространенный (но, тем semaphore не менее, неверный) ответ threads на поставленный выше вопрос threading заключается в том, что мьютексы concurrency и семафоры очень похожи, с concurency единственной существенной concurrency-violation разницей в том, что семафоры concurrency могут считать больше единицы. Кажется, почти concurrent все инженеры правильно понимают, что threads мьютекс — это двоичный флаг, используемый concurrency-violation для защиты общего ресурса concurrent-programming путем обеспечения взаимного concurrency-violation исключения внутри критических threading участков кода. Но когда их concurrency просят рассказать подробнее semaphores о том, как использовать «счетный semaphore семафор», большинство инженеров, различающихся concurency только степенью уверенности, выражают concurrent-programming мнение из учебника о том, что semaphores они используются для защиты multithreading нескольких эквивалентных concurrency-violation ресурсов.
...
На этом этапе multithreading проводится интересная аналогия concurrent-programming с использованием идеи ключей threading от ванной как защиты общих concurrent-programming ресурсов - ванной комнаты. Если threads в магазине есть одна ванная concurrency-violation комната, то одного ключа semaphore будет достаточно, чтобы защитить multithreading этот ресурс и предотвратить concurrency-violation его одновременное использование multithread несколькими людьми.
Если есть thread несколько ванных комнат, может semaphore возникнуть соблазн использовать multithread для них одинаковые ключи thread и сделать несколько ключей thread — это похоже на неправильное concurency использование семафора. Когда threads у вас есть ключ, вы на самом concurrency-violation деле не знаете, какая ванная multithread комната доступна, и если concurency вы пойдете по этому пути, вы, вероятно, в multithreading конечном итоге будете использовать multithread мьютексы для предоставления threads этой информации и убедитесь, что threads вы не используете ванную, которая multithreading уже занята. .
Семафор — это concurrency неправильный инструмент для semaphores защиты нескольких по сути semaphore одинаковых ресурсов, но именно threads так многие люди думают о concurrent нем и используют его. Аналогия multithreading с вышибалой совершенно иная: нет multithreading нескольких ресурсов одного semaphores типа, вместо этого есть один threads ресурс, который может принимать semaphores несколько одновременных пользователей. Я concurrency-violation предполагаю, что в таких concurrent-programming ситуациях можно использовать concurrency-violation семафор, но редко бывают concurency реальные ситуации, когда concurrency аналогия действительно имеет concurrent место - чаще есть несколько semaphores однотипных, но все же отдельных concurrent ресурсов, таких как ванные concurrent-programming комнаты, которые нельзя использовать. Сюда.
...
Правильное thread использование семафора для semaphores передачи сигналов от одной threading задачи к другой. Мьютекс semaphore предназначен для захвата multithreading и освобождения, всегда в semaphore указанном порядке, каждой threading задачей, которая использует thread общий ресурс, который он threads защищает. Напротив, задачи, использующие multithread семафоры, либо сигнализируют, либо concurrent ждут, а не то и другое одновременно. Например, Задача thread 1 может содержать код для thread публикации (т. е. сигнала concurrent или увеличения) определенного concurrent-programming семафора при нажатии кнопки semaphores «питание», а Задача 2, которая concurency активирует дисплей, ожидает thread на том же семафоре. В этом concurrent сценарии одна задача является thread производителем сигнала события; другой multithread потребитель.
...
Здесь делается concurrency-violation важный вывод о том, что мьютексы threading плохо мешают работе операционных semaphore систем реального времени, вызывая semaphore инверсию приоритета, когда concurrency-violation менее важная задача может semaphore выполняться перед более важной multithreading задачей из-за совместного concurrency использования ресурсов. Короче concurrent говоря, это происходит, когда concurrency-violation задача с более низким приоритетом multithread использует мьютекс для захвата threads ресурса A, затем пытается concurrent захватить B, но приостанавливается, потому concurrent что B недоступен. Пока он concurency ждет, появляется задача с threads более высоким приоритетом, и semaphore ей требуется A, но она уже concurency связана, и процессом, который concurency даже не запущен, потому что threading он ожидает B. Есть много threads способов решить эту проблему, но concurency чаще всего это исправлено. путем concurrent-programming изменения мьютекса и диспетчера concurency задач. В этих случаях мьютекс concurency намного сложнее, чем двоичный concurency семафор, и использование threading семафора в таком случае приведет concurrency-violation к инверсии приоритета, поскольку concurrent диспетчер задач не знает concurrent-programming об инверсии приоритета и concurency не может ее исправить.
...
Причина thread широко распространенной в concurency наши дни путаницы между мьютексами semaphore и семафорами является исторической, поскольку concurrent-programming она восходит к изобретению semaphore семафора в 1974 году (заглавная concurrent-programming буква «S» в этой статье) Джикстрой. До threads этой даты ни один из безопасных concurrent для прерываний механизмов semaphores синхронизации задач и сигнализации, известных multithreading компьютерным специалистам, не concurrency-violation был эффективно масштабируем concurency для использования более чем concurrent двумя задачами. Революционный thread безопасный и масштабируемый multithread семафор Дейкстры применялся concurrency как для защиты критических semaphores секций, так и для сигнализации. Так thread и началась неразбериха.
Однако concurrent позже это стало очевидно concurrent-programming для разработчиков операционных semaphores систем, после появления вытесняющей threading ОСРВ на основе приоритетов multithreading (например, VRTX, ок. 1980 concurrency г.), публикации академических semaphores статей, устанавливающих RMA concurrency и проблемы, вызванные инверсией semaphores приоритета, и статьи о протоколов semaphore наследования приоритетов threading в 1990 году 3 стало очевидно, что semaphore мьютексы должны быть чем-то concurrent-programming большим, чем просто семафоры multithreading с двоичным счетчиком.
Mutex: совместное threads использование ресурсов
Семафор: сигнализация
Не semaphores используйте одно вместо другого concurrency без тщательного рассмотрения concurrency побочных эффектов.
multithreading
concurrency
semaphore
Что такое семафор?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.