Я использую Boost.Asio и Boost.Thread. Как я могу отменить синхронную операцию ввода-вывода во вторичном потоке? Например,Boost.Asio: Могу ли я отменить операцию SYNCHRONOUS во вторичном потоке?
/* consider needed headers included and typedefs are defined */
void OperationThread(sock_ptr sock) {
char buf[128];
boost::system::error_code ec;
boost::asio::read(*sock, boost::asio::buffer(buf, 128), ec);
}
void AcceptorThread() {
boost::asio::io_service serv;
boost_asio_endpoint_type ep(... /* v4() etc. */ , ... /* port */);
boost_asio_acceptor_type acc(serv, ep);
sock_ptr sock(new boost_asio_socket_type(serv));
while (true) {
acc.accept(*sock);
boost::thread t(boost::bind(&OperationThread, sock)); // new thread
sock.reset(new boost_asio_socket_type(serv)); // new socket
}
}
int main() {
boost::thread accthread(&AcceptorThread);
cin.get();
// Code to cancel synchronous accept operation and read operations
return 0;
}
sock_ptr
является ЬурейеЕ из boost::shared_ptr<boost_asio_socket_type>
.
Если вы путаете около boost_asio_*_type
, считайте, что они сконфигурированы для boost::asip::ip::tcp
и v4()
.
Прежде всего, я использовал асинхронные операции. Но вы знаете, что их немного сложно справиться. И мне нужна модель приложения с одним потоком за соединение. Его сложнее реализовать с помощью асинхронного ввода-вывода (на самом деле я не знаю, как его реализовать, как я могу опросить конкретную асинхронную операцию в потоке?), Я был бы рад, если вы упомянуте.). Поэтому я использую синхронный ввод-вывод.
И в моем коде, как вы могли заметить, мой объект потока был уничтожен в конце блока. Это наносит какой-либо вред? (извините, я знаю, что это не уместно задавать в этом вопросе, но любой, кто хочет делать то, что я пытаюсь сделать, может столкнуться с этим вопросом. Поэтому, если вы ответите, я буду очень рад. ʘ‿ʘ)
Спасибо.
Asio не обеспечивает способ отмены синхронных операций (см. Этот [ответ] (http://stackoverflow.com/a/11195223/1053968) для аналогичного вопроса) , Кроме того, если кто-то борется с перевернутым управлением потоком от асинхронного программирования, я настоятельно рекомендую использовать поддержку сопрограммы Asio (см. Этот [ответ] (http://stackoverflow.com/a/13997290/1053968)). –