boost.asio - asynchronous io

Upload: yosvani-ramirez-martinez

Post on 16-Feb-2018

231 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/23/2019 Boost.asio - Asynchronous IO

    1/16

    Asynchronous I/O withBoost.Asio

    What are asynchronous operations?

    When shall I use Boost.Asio (and not threads)?

    How do I use Boost.Asio?

    How does Boost.Asiosarchitecture look like?

    What else do I need to know about Boost.Asio?

    Boris Schling, [email protected]

    Meeting C++, Dsseldorf, 10 November 2012

  • 7/23/2019 Boost.asio - Asynchronous IO

    2/16

    Asynchronous operations

    Asynchronous I/O with Boost.Asio 2

    do_sync()

    do_async (&done)

    event_loop()

    done()

    A library like Boost.AsioYour code

  • 7/23/2019 Boost.asio - Asynchronous IO

    3/16

    Boost.Asio vs. Boost.Thread

    Asynchronous I/O with Boost.Asio 3

    do_async (&done)

    event_loop()

    done()

    A library like Boost.AsioYour code

    Use asynchronous operations to access re-

    sources concurrently outside of your process

  • 7/23/2019 Boost.asio - Asynchronous IO

    4/16

    Boost.Asio vs. Boost.Thread

    Asynchronous I/O with Boost.Asio 4

    Your code

    Use threads to access resources

    concurrently in your process

    block()

  • 7/23/2019 Boost.asio - Asynchronous IO

    5/16

    Boost.Asio sample program

    Asynchronous I/O with Boost.Asio 5

    voidhandler(const boost::system::error_code &ec) {}

    intmain()

    {

    boost::asio::io_service io_service;

    boost::asio::deadline_timer timer(io_service,

    boost::posix_time::seconds(5));

    timer.async_wait(handler);

    io_service.run();}

  • 7/23/2019 Boost.asio - Asynchronous IO

    6/16

    Boost.Asio sample program

    Asynchronous I/O with Boost.Asio 6

    boost::asio::deadline_timer timer(io_service,

    boost::posix_time::seconds(5));

    timer.async_wait(handler);

    io_service.run();

    async_wait() returns immediately

    deadline_timer is one of many classes

    in Boost.Asio which make it possible

    to call functions asynchronously

    run() calls handler after 5 seconds

  • 7/23/2019 Boost.asio - Asynchronous IO

    7/16

    Asynchronous operations

    Asynchronous I/O with Boost.Asio 7

    deadline_timer

    ip::tcp::acceptor

    ip::tcp::resolver

    ip::tcp::socket

    async_wait() to wait until some time is expired

    async_accept() to accept TCP/IP connections

    async_resolve() to resolve hostnames

    async_read_some() and async_write_some()to send and receive data

    Boost.Asio provides different classes which turn

    different blocking functions into asynchronous functions

  • 7/23/2019 Boost.asio - Asynchronous IO

    8/16

    Boost.Asio terminology

    Asynchronous I/O with Boost.Asio 8

    voidhandler(const boost::system::error_code &ec) {}

    intmain()

    {

    boost::asio::io_service io_service;

    boost::asio::deadline_timer timer(io_service,

    boost::posix_time::seconds(5));

    timer.async_wait(handler);

    io_service.run();}

    I/O service object

    I/O object

  • 7/23/2019 Boost.asio - Asynchronous IO

    9/16

    Boost.Asio terminology

    Asynchronous I/O with Boost.Asio 9

    deadline_timer io_service

    An I/O object is initialized

    with an I/O service object.

    It doesnt use the I/O serviceobject thoughit uses

    services provided by the I/O

    service object.

    An I/O service object

    provides services to I/O

    objects. Think of it as a set ofservicesset because there

    is maximum one instance of

    each and every service.

    While I/O objects and I/O service objects are

    visible in user code, I/O services do the hard work

    in the background.

  • 7/23/2019 Boost.asio - Asynchronous IO

    10/16

    Boost.Asio architecture

    Asynchronous I/O with Boost.Asio 10

    I/O service B

    I/O service object

    I/O service A

    I/O object 3I/O object 2I/O object 1

  • 7/23/2019 Boost.asio - Asynchronous IO

    11/16

    Boost.Asio architecture

    Asynchronous I/O with Boost.Asio 11

    boost::asio::

    deadline_timer_service

    boost::asio::

    io_service

    boost::asio::

    stream_socket_service

    boost::asio::

    basic_deadline_timer

    boost::asio::ip::tcp::

    basic_socket_iostream

    boost::asio::ip::tcp::

    basic_stream_socket

  • 7/23/2019 Boost.asio - Asynchronous IO

    12/16

    Multiple async operations

    Asynchronous I/O with Boost.Asio 12

    ...

    boost::asio::io_service io_service;

    boost::asio::deadline_timer timer1(io_service,

    boost::posix_time::seconds(5));

    boost::asio::deadline_timer timer2(io_service,

    boost::posix_time::seconds(5));

    timer1.async_wait(handler);

    timer2.async_wait(handler);

    io_service.run();...

  • 7/23/2019 Boost.asio - Asynchronous IO

    13/16

    Boost.Asio with threads

    Asynchronous I/O with Boost.Asio 13

    ...

    boost::asio::io_service io_service;

    boost::asio::deadline_timer timer(io_service,

    boost::posix_time::seconds(5));

    timer.async_wait(handler);

    boost::thread t([&io_service]{ io_service.run(); });

    io_service.run();

    t.join();

    ...

  • 7/23/2019 Boost.asio - Asynchronous IO

    14/16

    Synchronization with strand

    Asynchronous I/O with Boost.Asio 14

    ...

    boost::asio::io_service::strand strand(io_service);

    timer1.async_wait(strand.wrap(handler));

    timer2.async_wait(strand.wrap(handler));

    boost::thread t([&io_service]{ io_service.run(); });

    io_service.run();

    t.join();

    ...

  • 7/23/2019 Boost.asio - Asynchronous IO

    15/16

    No return with work

    Asynchronous I/O with Boost.Asio 15

    ...

    boost::asio::io_service io_service;

    boost::asio::io_service::work work(io_service);

    io_service.run();

    ...

  • 7/23/2019 Boost.asio - Asynchronous IO

    16/16

    More information

    50 Boost C++ Libraries in 180 minutes 16

    Boost.Asio documentation:http://www.boost.org/libs/asio/

    BoostCon presentations:http://boostcon.boost.org/presentations/

    Thinking asynchronously (Chris Kohlhoff, 2011)

    Creating Boost.Asio extensions (Boris Schling, 2011)

    Online book:http://en.highscore.de/cpp/boost/asio.html

    http://www.highscore.de/cpp/boost/asio.html(German)

    http://zh.highscore.de/cpp/boost/asio.html (Chinese)

    JTC1/SC22/WG21 paper N3388:http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3388.pdf

    http://www.boost.org/libs/asio/http://boostcon.boost.org/presentations/http://en.highscore.de/cpp/boost/asio.htmlhttp://www.highscore.de/cpp/boost/asio.htmlhttp://zh.highscore.de/cpp/boost/asio.htmlhttp://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3388.pdfhttp://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3388.pdfhttp://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3388.pdfhttp://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3388.pdfhttp://zh.highscore.de/cpp/boost/asio.htmlhttp://www.highscore.de/cpp/boost/asio.htmlhttp://en.highscore.de/cpp/boost/asio.htmlhttp://boostcon.boost.org/presentations/http://boostcon.boost.org/presentations/http://www.boost.org/libs/asio/http://www.boost.org/libs/asio/