asio и блокировка вызывающего
От: niXman Ниоткуда https://github.com/niXman
Дата: 03.04.13 06:34
Оценка:
приветствую!

есть самописный класс сокета поверх asio.
предвидя вопросы типа "а зачем оно надо?", объясняю суть: внутренняя обработка очереди задач. т.е. в пользовательской коде можно несколько раз вызывать socket::write(..., handler)/socket::read(..., handler), и, при этом, сокет сам будет выполнять чтение/запись при завершении предыдущей задачи. сокет работает отлично(проверенно в нескольких проектах, в том числе и коммерческих). на самом деле, за мои несколько лет работы разработчиком протоколов/серверов, собралась некоторая порция кода, который был унифицирован, и который используется как "шаблон" построения серверов.
сейчас, подумываю выложить этот код на опенсорс, и занялся рефаком, чтоб стереть схожесть с коммерческими проектами, в которых этот код использовался.

вопрос в следующем:
сейчас, при использовании этого сокета есть вероятность того, что очередь может вырасти до очень больших размеров, ибо нет ограничения на размер очереди.
идей решения у меня две:
1. методы socket::write(..., handler)/socket::read(..., handler) изменить так, чтоб они возвращали true в случае успешного добавления задачи, и false если очередь переполнена.
2. socket::write(..., handler)/socket::read(..., handler) изменить так, чтоб они блокировали вызывающего ровно на одну задачу(io_service::run_one()). (неважно какую, ибо io_service может быть один для тысяч сокетов(и не только))
3. дополнительный аргумент(установленный в какое-то значение по умолчанию), который и будет означать, как вести себя при переполнении: пункт 1, пункт 2.

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

благодарен за мысли.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.