2015-04-20 5 views
0

Мне интересно, почему я могу использовать boost :: asio :: io_service без вызова run() для синхронных операций сокета? Например, приведена следующая часть кода:Почему io_service может использоваться без run() для синхронных операций

boost::asio::io_service io_service; 
tcp::acceptor a_event_data(io_service, tcp::endpoint(tcp::v4(), port + 2)); 
// Accept a connection to event socket 
socket_ptr sock_event_data(new tcp::socket(io_service)); 
a_event_data.accept(*sock_event_data); 

boost::asio::ip::tcp::endpoint endpoint_event_data = sock_event_data->remote_endpoint(); 
std::cout << "Accepted a connection for Event Data socket from " << endpoint_event_data.address().to_string() << std::endl; 

Но нет вызова для запуска(). В случае асинхронных подключений я должен использовать его. Является ли это фиктивным использованием io_service здесь только для взаимодействия с системой?

+0

По существу, да; но нет ничего, что мешало бы вам смешивать операции async/sync, а базовая структура действительно не знает, в каком режиме вы будете использовать фреймворк в. – Nim

+0

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

ответ

0

Синхронная операция выполняет операции ввода-вывода в текущем потоке. Асинхронная операция выполняет операции ввода-вывода в одном из потоков в пуле потоков io_service. Если вы не вызываете run() хотя бы один раз (когда есть реальная работа, иначе она сразу же вернется), в пуле нет потока.

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