Введение в Boost.Asio
Asio означает asynchronous input/output – асинхронный ввод-вывод. Данная библиотека позволяет обрабатывать данные асинхронно, т.е. операция может быть запущена, и, не дожидаясь конца выполнения этой операции, мы можем запустить другую операцию.
Asio оповещает об окончании выполнения операции. Преимущество – операции могут быть запущены параллельно, т.е. мы выигрываем в производительности.
I/O services и I/O objects
Программы, которые используют Boost.Asio для асинхронной обработки данных, основаны на I/O services и I/O objects. Для I/O services существует единственный класс boost::asio::io_service. В противоположность этому для I/O objects существуют несколько классов: – объект типа сокет boost::asio::ip::tcp::socket для TCP/IP соединения; – если данные пересылаются асинхронно через сериальный порт boost::asio::serial_port может быть инстанциирован; – другие классы, например boost::asio::steady_timer.
Пример многопоточной программы, использующей Boost.Asio
В заключении нашего обзора, чтобы почувствовать вкус, приведём пример многопоточной программы, использующей Boost.Asio:
#include <boost/asio/io_service.hpp> #include <boost/asio/steady_timer.hpp> #include <chrono> #include <thread> #include <iostream> using namespace boost::asio; int main() { io_service ioservice; steady_timer timer1{ioservice, std::chrono::seconds{3}}; timer1.async_wait([](const boost::system::error_code &ec) { std::cout << "3 sec\n"; }); steady_timer timer2{ioservice, std::chrono::seconds{3}}; timer2.async_wait([](const boost::system::error_code &ec) { std::cout << "3 sec\n"; }); std::thread thread1{[&ioservice](){ ioservice.run(); }}; std::thread thread2{[&ioservice](){ ioservice.run(); }}; thread1.join(); thread2.join(); }
Есть вопрос? Напишите в комментариях!