18

I have been going throught the boost asio library in which most of the objects need the io_context object as argument to the constructor. I have read what io_context object,according to the documentation it states that it is

The io_context class provides the core I/O functionality for users of the asynchronous I/O objects

Which confuses me because isn't that what iostream does.I'm really sure i'm missing something,please help me clarify it and also i don't see much difference between I/O objects with the sockets other than fact that sockets can be used for exchanging data between two devices whereas I/O objects enable us to exchange data with our computer.I'm really confused at this point!

Bad_Panda
  • 427
  • 1
  • 5
  • 11

1 Answers1

22

io_context contains state required to run the event loop based on select, epoll, or other platform-specific calls and dispatch events, such as socket readiness, timer, signal, idle, to the callbacks the user has registered. Many callbacks for different sockets, timers, etc.. can be registered with one io_context. io_context doesn't do I/O, but it invokes those callbacks when I/O can be done in non-blocking fashion, e.g. data has arrived and the socket is ready for read, and the callback does the actual non-blocking I/O.

See Basic Boost.Asio Anatomy for more details.

Other popular event loops are libevent and libuv

The C10K problem is old but quite instructive on the subject of async I/O.


C++20 coroutines introduce a new programming model, which has benefits of being simpler to write and read and it mitigates callback hell inherent in non-blocking I/O code. Boost.Asio supports coroutines.

Zitrax
  • 19,036
  • 20
  • 88
  • 110
Maxim Egorushkin
  • 131,725
  • 17
  • 180
  • 271
  • Can each process have only 1 io_context ? Is it possible to have multiple threads in a process and each thread running an io_context ? – Harini Sj Jun 15 '21 at 13:32
  • @HariniSj https://www.boost.org/doc/libs/develop/doc/html/boost_asio/overview/core/threads.html – Maxim Egorushkin Jun 16 '21 at 19:17
  • @MaximEgorushkin Sorry, I have carefully read the document which is linked to, but I am still not so sure. As per the document, which says that:“In general, it is safe to make concurrent use of distinct objects.” So, it seems that there could be more than one io_context in a single process. More is at the next comment. – John Jul 03 '21 at 09:58
  • @MaximEgorushkin I am confused again after I have read another document. As per this [document](https://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/reference/async_write/overload1.html), which says that:The program must ensure that the stream performs no other write operations (such as async_write, the stream's async_write_some function, or any other composed operations that perform writes) until this operation completes. It seems that two boost::ansy_write could not be could be called at the same time, so it seeems that it's useless to have more than one io_context in a single process. – John Jul 03 '21 at 09:59
  • 1
    The link given in `See Basic Boost.Asio Anatomy for more details.` is broken. This is the correct link now: https://www.boost.org/doc/libs/1_76_0/doc/html/boost_asio/overview/core/basics.html (Edit queue is full, so can't edit the post) – Keivan Sep 08 '22 at 17:18