ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1012941 Топик полностью
fk0, легенда (18.06.2020 15:41, просмотров: 996) ответил LightElf на Бинарный семафор. Самый приоритетный из ожидающих проснется, заберет семафор, проверит место. Если места достаточно - отправит данные. Если недостаточно - снова встанет на этом же самом семафоре.
A остальные что, будут вечно спать? Я забыл уточнить, но записи в буфере не фиксированного размера (логгер -- текстовые строчки, вроде очевидно). Да и посылаются в компорт может быть не по одной. Вместо одной ушедшей можно 5 новых записать, и наоборот. Будить нужно всех ожидающих. И потом, между моментом проверки (нет места) и засыпанием на семафоре запросто могло появиться свободное место. И наоборот, после получения сигнала семафора другой поток мог занять всё своими 

сообщениями.


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

[ZX]