Как может любой поток сигнализировать об освобождении двоичного семафора


Я новичок в многопоточной парадигме. Изучая параллелизм, каждый источник, который я нашел, говорит:

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

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

Нет ли в этом области непоследовательности или я что-то упускаю?

1 3

1 ответ:

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

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

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