Как семафор работает?

Существует много библиотек Java для синхронизации/репликации данных. Два, что я знаю, нарцисс и SymmetricDS. В предыдущей жизни я по-дурацки реализовал (в Java) свой собственный процесс репликации данных. Это походит на вид вещи, которая должна быть довольно простой, но если данные могут быть обновлены в нескольких местах одновременно, это - сложный hellishly. Я настоятельно рекомендую использовать один из вышеупомянутых проектов попытаться обойти контакт с этой сложностью сами.

14
задан Jan Hrcek 9 October 2012 в 09:10
поделиться

4 ответа

Вызов, когда он 0, не должен работать. Звонок, когда уже 3, работает. (Я думаю о Java.)

Позвольте мне добавить еще. Многие люди думают о блокировках как о (бинарных) семафорах (то есть - N = 1, поэтому значение семафора равно 0 (удерживается) или 1 (не удерживается)). Но это не совсем так. У блокировки есть понятие «владение», поэтому она может быть «реентерабельной». Это означает, что потоку, который удерживает блокировку, разрешено снова вызвать lock () (эффективно перемещая счетчик с 0 на -1), потому что поток уже удерживает блокировку и может «повторно войти» в нее. Блокировки также могут быть безвозвратными. Ожидается, что владелец блокировки вызовет unlock () столько же раз, что и lock ().

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

Кроме того, в том, что я видел (это Java), вы можете увеличить семафор больше, чем N, и это также сортирует of имеет отношение к владению: семафор не имеет понятия права собственности, поэтому любой может дать ему больше разрешений. В отличие от потока, где всякий раз, когда поток вызывает unlock (), не удерживая блокировку, это является ошибкой. (В java это вызовет исключение.)

Надеюсь, такой способ мышления поможет.

Ожидается, что держатель блокировки вызовет unlock () столько же раз, что и lock ().

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

Кроме того, в том, что я видел (это Java), вы можете увеличить семафор больше, чем N, и это также сортирует of имеет отношение к владению: семафор не имеет понятия о праве собственности, поэтому любой может дать ему больше разрешений. В отличие от потока, где всякий раз, когда поток вызывает unlock (), не удерживая блокировку, это является ошибкой. (В java это вызовет исключение.)

Надеюсь, такой способ мышления поможет.

Ожидается, что держатель блокировки вызовет unlock () столько же раз, что и lock ().

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

Кроме того, в том, что я видел (это Java), вы можете увеличить семафор больше, чем N, и это также сортирует of имеет отношение к владению: семафор не имеет понятия о праве собственности, поэтому любой может дать ему больше разрешений. В отличие от потока, где всякий раз, когда поток вызывает unlock (), не удерживая блокировку, это является ошибкой. (В java это вызовет исключение.)

Надеюсь, такой способ мышления поможет.

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

Кроме того, в том, что я видел (это Java), вы можете увеличить семафор больше, чем N, и это также сортирует of имеет отношение к владению: семафор не имеет понятия о праве собственности, поэтому любой может дать ему больше разрешений. В отличие от потока, где всякий раз, когда поток вызывает unlock (), не удерживая блокировку, это является ошибкой. (В java это вызовет исключение.)

Надеюсь, такой способ мышления поможет.

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

Кроме того, в том, что я видел (это Java), вы можете увеличить семафор больше, чем N, и это также сортирует of имеет отношение к владению: семафор не имеет понятия права собственности, поэтому любой может дать ему больше разрешений. В отличие от потока, где всякий раз, когда поток вызывает unlock (), не удерживая блокировку, это является ошибкой. (В java это вызовет исключение.)

Надеюсь, такой способ мышления поможет.

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

Надеюсь, такой способ мышления поможет.

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

Надеюсь, такой способ мышления поможет.

6
ответ дан 1 December 2019 в 07:41
поделиться

(Используя терминологию из java.util.concurrent.Semaphore с учетом тега Java. Некоторые из этих деталей зависят от реализации. Я подозреваю, что ваш «отказ» - это семафор Java () , и ваш "up" - release () .)

Да, ваш последний вызов acqu () будет заблокирован до тех пор, пока другой поток не вызовет ] release () или ваш поток прерван.

Да, вы можете вызывать release () несколько раз, а затем еще раз - по крайней мере, с помощью java.util.concurrent. Семафор .

Некоторые другие реализации семафора могут иметь представление о «максимальном» количестве разрешений, и вызов высвобождения сверх этого максимума завершится ошибкой. Класс Java Semaphore допускает обратную ситуацию, где семафор может начинаться с отрицательного числа разрешений, и все вызовы acqu () завершатся ошибкой до тех пор, пока не будет достаточно вызовов release () . Как только количество разрешений станет неотрицательным, оно больше никогда не станет отрицательным.

18
ответ дан 1 December 2019 в 07:41
поделиться

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

Вы можете думать о значении таким образом: положительное число означает, что доступно столько ресурсов. Отрицательное значение означает, что существует много сущностей, нуждающихся в ресурсе, когда все ресурсы заняты в данный момент. Когда вы приобретаете ресурс, вы уменьшаете его значение, когда вы его отпускаете, вы увеличиваете значение. Если значение по-прежнему> = 0 после уменьшения, вы получаете ресурс, в противном случае ваша сущность помещается в очередь.

Хорошее объяснение семафоров в Википедии: http://en.wikipedia.org/wiki/Semaphore_ (программирование)

2
ответ дан 1 December 2019 в 07:41
поделиться

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

1
ответ дан 1 December 2019 в 07:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: