Вопросы, связанные с реализацией и дизайном Java-семафора - PullRequest
0 голосов
/ 31 августа 2018

В настоящее время я занимаюсь разработкой счетного семафора в C ++, пытаясь соответствовать тому же уровню стандарта, что и Java, за исключением InterupptedExceptions, так как st ++ :: threads C ++ не поддерживают прерывание. Я читал документацию по классу на Java и натолкнулся на два вопроса, которые действительно меня сейчас смущают.

https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/Semaphore.html

Вопрос 1:

в отношении освобождения разрешений. Я вижу, что в заявлении "Не существует требования, чтобы поток, который выпускает разрешение, приобрел это разрешение путем вызова acqu ()". Если не существует права собственности на получение разрешения и его выдачу в том же порядке, что и в следующем случае.

какой-то мошеннический поток просто пытается запустить релиз, и он никогда не получал его вообще. Что будет выпущено тогда? молча возвращается и ничего не делает?

Вопрос 2:

Что происходит, если поток получает счетчик семафоров и выдает исключение, когда выпуск просто пропускается, возможно, из-за того, что исключение распространяется за пределы класса этой функции потока. Это приводит к утечке в таком случае?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Мои два цента:

какой-то мошеннический поток просто пытается запустить релиз, и он никогда не получал его вообще. Что будет выпущено тогда? молча возвращается и ничего не делает?

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

Приводит ли это к утечке в таком случае?

В аналогичных строках, если поток уменьшает разрешение (разрешения) путем получения и завершается неудачей по какой-либо причине, не освобождая его, счет останется прежним. Я не буду называть это утечкой, поскольку возможен сценарий, когда конечный пользователь просто хочет использовать разрешения, даже не выпуская их.

0 голосов
/ 31 августа 2018

какой-то жулик просто пытается запустить релиз и никогда приобрел любой вообще. Что будет выпущено тогда? делает это молча вернуться и ничего не делать?

Лучше назвать это increment вместо release или return. Вы даже можете создать Semaphore с отрицательным разрешением:

Semaphore semaphore = new Semaphore(-1);

В этой ситуации, если поток A попытается aquire(), он будет заблокирован, пока другие потоки не увеличат разрешение на release() дважды.

Приводит ли это к утечке в таком случае?

Именно поэтому предлагается использовать Semaphore с блоком try catch finally, когда ресурс ограничен:

semaphore.aquire();
try {

} catch () {

} finally {
    semaphore.release();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...