2014-02-12 3 views
13

Nonbinary ones.
У меня никогда не возникало проблемы, которая требовала от меня использования семафора вместо мьютекса. Так это в основном теоретическая конструкция, или реальный sw, как Office, Firefox есть места, где они его используют? Если да, то каковы общие шаблоны использования для семафоров?Каково практическое использование семафоров?

+0

Эта статья не затрагивает ваш вопрос, но является очень хорошим руководством по мьютексам и семафорам: http://www.geeksforgeeks.org/mutex-vs-semaphore/ –

+0

Проверьте проблему с производителем/потребителем. – zoska

+0

Итак, когда вы на машине, вы не ругаетесь с другими – AAlferez

ответ

3

Я думаю, вы уже знаете, что такое семафор и вы просто интересно, как он используется в «реальном программном обеспечении».

«Настоящий sw like Office, Firefox есть места, где они его используют?»

Да, «реальное программное обеспечение» использует семафоры много, это не просто теоретическое, например. Chromium source, windows semaphore handling code и тот же код, который используется Virtual Box.

«Каково практическое использование семафоров»/«Каковы общие шаблоны использования для семафоров?»

Они более подходят для проблем синхронизации производителей и потребителей. Ситуации, которые у вас есть количество производителей и потребителей как> 1.

хороших The Fuhrmanator в reference типичном использовании семафоров.

9

Небациональные семафоры используются при распределении ресурсов. Семафор может содержать счетчик количества определенного ресурса.

Если у вас есть пул соединений, например, используемый веб-браузер, то отдельный поток может резервировать член пула, ожидая на семафоре, чтобы получить соединение, использует соединение, а затем освобождает соединение посредством освобождая семафор.

Вы можете эмулировать семафор, создавая счетчик, а затем устанавливая зону взаимного исключения вокруг счетчика. Однако, ожидая ресурса, такого как выше, требуется двухуровневый мьютекс и не настолько изящна, как использование семафора.

9

Семафор может рассчитывать. Подсчет является принципиально небезопасным, это операция чтения-изменения-записи на процессоре, и поэтому не атом. Доступны меньшие примитивы для безопасного подсчета, Interlocked.Increment() является атомарным. Но атомичность - довольно слабый примитив с потоками, во многих случаях у вас также есть блок код, когда счетчик имеет критическое значение.

Поскольку 0 является критическим, все ресурсы использовались. Стандартный пример - подсчет процессорных ядер для запуска потоков, как только вы использовали их все, тогда вы не должны запускать другой поток, пока один из них не завершится и больше не нуждается в процессорном ядре. Как основное, как это получается.

Бинарные семафоры часто встречаются в литературе по нарезке. Стандартный ввод текстовой книги и тесно связан с одним голландером по имени Эдсгер Дейкстра. Пионер в области компьютерных наук, который впервые начал думать в 1960-х годах о том, что вы сделали бы, чтобы получить процессор для запуска нескольких программ. Его аннотации P и V имеют смысл только для голландского спикера, подобного мне. Parkeer и Vrij - это те термины, которые вы используете, когда пытаетесь поставить свой автомобиль где-то :) Это было задолго до того, как все начали думать о том, что существуют разные типы примитивов, таких как мьютекс и монитор. Примитивы, которые требуют только поддержки семафора, после получения двоичного семафора, вы делаете все остальное. Построение абстракций поверх базового объекта, способ составления композиции в программном обеспечении.

Noodling на бит, я на рулоне, одна вещь, которая делает Семафор совершенно отличным от других примитивов, таких как Mutex и Monitor, и lock заключается в том, что он не имеет сходства нитей. Это довольно сложная задача, когда вы пишете код с резьбой, обычный контракт, который вы пытаетесь реализовать, состоит в том, что только один поток может одновременно обращаться к ресурсу. Все остальные объекты синхронизации .NET: re-entrant, вы не можете застопориться, сделав блокировку более одного раза в одном потоке. Они очень дружелюбны и просто увеличивают счетчик, когда вы приобретаете замок. И пересчитайте снова, когда вы отпустите. И только откажитесь от блокировки, когда счет достигнет 0. Семафор не работает таким образом вообще, он рассчитывает, когда вы приобретаете независимо от того, какой поток приобрел его. В некоторых случаях это действительно имеет значение, например, пример обратного потока-потока, который я цитировал ранее.

Который действительно Что полезно для. Не совсем очень часто. Монитор - швейцарский армейский нож с резьбой, поэтому он получил свое собственное ключевое слово. блокировки ключевое слово в C#, SyncLock в VB.NET

+0

+1, но я полностью не понял третий абзац: D – NoSenseEtAl

2

Возможный практический пример может быть фиксированным пулом потоков: вы не хотите тратить все свои системные ресурсы, чтобы вы разрешали только определенное количество потоков для выполнения в определенное время; все оставшиеся потоки будут ждать в очереди.

Теперь я сомневаюсь, что, например, пул потоков Java реализован с использованием голого ресурса, такого как семафор, но всякая конструкция синхронизации теоретически эквивалентна. Вы можете получить полное объяснение на Java Пулы потоков (и стационарных бассейнов темы) здесь: http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

3

Цитирование Дуг Шмидт в http://www.cs.wustl.edu/~schmidt/win32-cv-1.html разделе 2.2:

счетные семафоры являются механизм синхронизации обычно используется для сериализации или координировать множественным потоки управления. Понятно, что подсчеты семафоров - это целые неотрицательные числа, которые могут быть увеличены и уменьшены атомарно. Если поток пытается уменьшить семафор, значение которого равно 0, этот поток приостанавливается, ожидая, пока другой поток увеличит счет семафора выше 0.

Подсчет семафоров часто используется для отслеживания изменений состояния объектов, разделяемых несколькими потоки в процессе. Например, они могут записывать появление определенного события. В отличие от переменных условий семафоры сохраняют состояние. Поэтому они позволяют потокам принимать решения на основе этого состояния, даже если событие произошло в прошлом.

Что касается моделей, есть два, как на http://www.freertos.org/Real-time-embedded-RTOS-Counting-Semaphores.html

счетные семафоры, как правило, используются для двух вещей:

  1. Подсчет событий. В этом сценарии использования обработчик события будет «давать» семафор каждый раз, когда происходит событие (увеличивая значение счетчика семафора), и задача обработчика будет «брать» семафор каждый раз, когда он обрабатывает событие (уменьшая значение счета семафора) , Следовательно, значение счетчика является разницей между количеством событий, которые произошли, и количеством, которое было обработано. В этом случае желательно, чтобы значение счета было равно нулю при создании семафора.

  2. Управление ресурсами. В этом сценарии использования значение count указывает количество доступных ресурсов. Чтобы получить контроль над ресурсом, задача должна сначала получить семафор - декремент значения счетчика семафора. Когда значение счета достигает нуля, свободных ресурсов нет. Когда задача заканчивается ресурсом, он «возвращает» семафор назад - увеличивает значение счетчика семафора. В этом случае желательно, чтобы значение счета было равно максимальному значению счета при создании семафора.

3

Я использовал семафор в производственных условиях несколько раз. Запустите службу Windows, которая получит список задач для выполнения. Эти задачи могут выполняться параллельно. Поэтому мы сначала просто бросили их все в .net Threadpool и запустили их.

После непродолжительного периода возникла проблема. Работа, выполненная параллельно, также использовала threadpool. Поэтому, если мы запустили слишком много задач в threadpool, они будут потреблять весь пул, а затем ждать, пока их поставленная в очередь задача получит слот в threadpool.

Утечка решения заключается в том, чтобы просто держать общий счетчик, где задачи будут увеличиваться и уменьшаться, пока они продолжают работать. Это работало некоторое время, но в конечном итоге служба перестала бы делать что-либо. Повторные условия гонки привели к тому, что счетчик показывал, что все разрешенные слоты в threadpool были приняты, хотя ничего не было.

В конце Семафор решил проблему.

Смежные вопросы