2013-09-10 2 views
1

У меня есть метод, который запускает новый std :: thread для новых подключений, чтобы я мог читать данные и делать другие вещи. Метод, который вызывает поток, запускает чтение асинхронным способом (с использованием функций ускорения), и он возвращается после вызова async_read_some, мой вопрос:Async методы с потоками

Какой поток обрабатывает обратный вызов? Это тот же самый поток, который вызвал звонок на async_read_some, или же этот поток умереть после того, как он вызвал его и вернулся, и теперь основной поток обрабатывает чтение?

Вот фрагмент кода:

connection::connection_thread = std::thread(&connection::read_header, 
               this); 
    connection::connection_thread.detach(); 
       . 
       . 
       . 
    void connection::read_header() { 
    socket_.async_read_some(boost::asio::buffer(headbuf_), 
     strand_.wrap(
     boost::bind(&connection::on_header_read, shared_from_this(), 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred))); 
    begin_timeout(); 
    } 

ответ

1

Что нить обрабатывает обратный вызов?

Поток (или один из потоков, если их несколько), который опроса или запускает связанный io_service. Обработчик передается службе, которая должна быть вызвана по завершении.

Является ли это тот же самый поток, который уравнял в async_read_some

Нет, async функции не вызывает обработчик напрямую; он всегда вызывается io_service, даже если операция завершается немедленно.

или сделал эту резьбу после того, как он назвал ее и вернулся, и теперь основная нить обрабатывает чтение?

Это полностью зависит от того, как вы управляете потоками. Поток, который вызывает async, может умереть, если вам это больше не нужно; вам понадобится другой поток или потоки (возможно, основной поток, возможно, другие) для обработки io_service и завершения асинхронной операции.

Однако нет смысла запускать нить, чтобы начать асинхронную операцию, так как это будет немедленно завершено. Переместите вызов на async_read_some туда, где вы сейчас запускаете поток; или использовать нить для выполнения операции синхронно. Если вы выберете многопоточный синхронный проект, вам не понадобится нить для опроса io_service для асинхронных операций.

+0

Я не уверен, что получил то, что вы имеете в виду, извините. Единственное, что я делаю с моим потоком, это то, что я создаю новый для каждого нового соединения, затем, используя недавно созданный поток, вызываю async_read_some, а затем поток возвращается; больше ничего. – Fingolfin

+0

@AdelQodmani: Хорошо. Кроме того, для обработки асинхронных операций вам потребуется также поток для вызова 'run' или' poll' в 'io_service'; иначе они никогда не произойдут (или, по крайней мере, они никогда не закончатся). –

+0

Я добавил связанный фрагмент кода. – Fingolfin

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