Comments 7
1) А зачем здесь используются unique_ptr-ы?
2) (На правах идеи, не факт, что это приемлемо). Я бы вынес всю работу за пределы callback-ов. То есть, в callback-е только лишь заполняется очередь действий, а в конце event loop-а эта очередь разбирается и выполняются все действия
std::unordered_map<curl_socket_t, std::unique_ptr<active_socket_t>> active_sockets_;
2) (На правах идеи, не факт, что это приемлемо). Я бы вынес всю работу за пределы callback-ов. То есть, в callback-е только лишь заполняется очередь действий, а в конце event loop-а эта очередь разбирается и выполняются все действия
0
По п.1. Хороший вопрос. Спасибо. Наверное, можно было бы попробовать хранить active_socket_t прямо по значению внутри unordered_map. Но тогда его нужно было бы делать Moveable-типом, чтобы можно было делать такой вызов:
По п.2. Не готов сейчас сказать, насколько бы это упростило реализацию. Тут же основной момент в том, что в event_cb нужно дергать curl_multi_socket_action, откуда будут дергать socket_function. И внутри этой socket_function нужно обновить статус и выяснить, какие операции над сокетом нас будут интересовать дальше. Можно это обновление статуса сперва закинуть в какую-то очередь, потом по ней пройтись… Но будет ли это проще — не знаю.
active_sockets_.emplace(handle, active_socket_t{ioctx_})
А можно ли его таковым сделать зависит от того, является ли asio::ip::tcp::socket Moveable-типом. В случае же с unique_ptr-ом для active_socket_t вообще не нужно было ни о чем думать: ни о том, является ли asio::ip::tcp::socket Moveable, ни о том, в каком контейнере затем active_socket_t будут хранится. И будут ли они вообще где-то храниться.По п.2. Не готов сейчас сказать, насколько бы это упростило реализацию. Тут же основной момент в том, что в event_cb нужно дергать curl_multi_socket_action, откуда будут дергать socket_function. И внутри этой socket_function нужно обновить статус и выяснить, какие операции над сокетом нас будут интересовать дальше. Можно это обновление статуса сперва закинуть в какую-то очередь, потом по ней пройтись… Но будет ли это проще — не знаю.
0
1) У map-а есть метод, который конструирует данные на месте
m.emplace(std::piecewise_construct,
std::forward_as_tuple("c"),
std::forward_as_tuple(10, 'c'));
+1
Спасибо, я про него постоянно забываю и использовать пока не приходилось.
0
Попробовал.
От такого варианта emplace пользы в данном случае нет. Т.к. сначала нужно создать объект active_socket_t, затем извлечь из него native_handle. И только после этого делать emplace с использованием native_handle в качестве ключа.
Чтобы это работало нужно делать active_socket_t Moveable-типом. Это возможно, т.к. asio::ip::tcp::socket так же Moveable-тип.
От такого варианта emplace пользы в данном случае нет. Т.к. сначала нужно создать объект active_socket_t, затем извлечь из него native_handle. И только после этого делать emplace с использованием native_handle в качестве ключа.
Чтобы это работало нужно делать active_socket_t Moveable-типом. Это возможно, т.к. asio::ip::tcp::socket так же Moveable-тип.
0
Да, как-то не подумал над этим
0
Как бы то ни было, спасибо, что обратили внимание.
Сделали так, для разнообразия, в англоязычной версии примера.
Сделали так, для разнообразия, в англоязычной версии примера.
0
Sign up to leave a comment.
Articles
Change theme settings
Асинхронные HTTP-запросы на C++: входящие через RESTinio, исходящие через libcurl. Часть 3