2015-07-17 4 views
1

Я использую 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().

Прежде всего, я использовал асинхронные операции. Но вы знаете, что их немного сложно справиться. И мне нужна модель приложения с одним потоком за соединение. Его сложнее реализовать с помощью асинхронного ввода-вывода (на самом деле я не знаю, как его реализовать, как я могу опросить конкретную асинхронную операцию в потоке?), Я был бы рад, если вы упомянуте.). Поэтому я использую синхронный ввод-вывод.

И в моем коде, как вы могли заметить, мой объект потока был уничтожен в конце блока. Это наносит какой-либо вред? (извините, я знаю, что это не уместно задавать в этом вопросе, но любой, кто хочет делать то, что я пытаюсь сделать, может столкнуться с этим вопросом. Поэтому, если вы ответите, я буду очень рад. ʘ‿ʘ)

Спасибо.

+0

Asio не обеспечивает способ отмены синхронных операций (см. Этот [ответ] (http://stackoverflow.com/a/11195223/1053968) для аналогичного вопроса) , Кроме того, если кто-то борется с перевернутым управлением потоком от асинхронного программирования, я настоятельно рекомендую использовать поддержку сопрограммы Asio (см. Этот [ответ] (http://stackoverflow.com/a/13997290/1053968)). –

ответ

0

Да, вы можете, до тех пор, пока вы прогестривно синхронизируете доступ к объекту службы (например, boost::asio::ip::tcp::socket или boost::asio::deadline_timer) ¹.

В вашем коде, кроме того, вы бы использовали shared_ptr<> из разных тем. Общие указатели: небезопасный поток per se. Хотя вы можете использовать the atomic_load and atomic_store functions с ними, чтобы сделать его потокобезопасным.


¹ Документация раскрывает (исключительные) случаи, когда объекты являются потокобезопасными. Единственными двумя, которые я могу привести из памяти, являются boost::asio::io_service и boost::asio::strand

+0

OK. Не могли бы вы дать псевдокод вашему ответу? Если бы вы не могли, по крайней мере, могли бы вы ссылаться на документацию или пример? –

+0

Вот ссылка на документы: http://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/overview/core/threads.html Я не знаю, что писать, потому что я не конечно, чего вы хотите достичь. Я считаю, что в учебниках/примерах показано все, что вы пытаетесь сделать. – sehe

+0

Благодарим вас за информацию о безопасности потоков 'shared_ptr'. –

Смежные вопросы