Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

Strands: Use Threads Without Explicit Locking

A strand is defined as a strictly sequential invocation of event handlers (i.e. no concurrent invocation). Use of strands allows execution of code in a multithreaded program without the need for explicit locking (e.g. using mutexes).

Strands may be either implicit or explicit, as illustrated by the following alternative approaches:

In the case of composed asynchronous operations, such as async_read() or async_read_until(), if a completion handler goes through a strand, then all intermediate handlers should also go through the same strand. This is needed to ensure thread safe access for any objects that are shared between the caller and the composed operation (in the case of async_read() it's the socket, which the caller can close() to cancel the operation).

This is done by partially specialising the boost::asio::ssociated_executor<> trait for all intermediate handlers. This trait forwards to the corresponding trait specialisation for the final handler:

struct my_handler
{
  void operator()() { ... }
};

namespace boost { namespace asio {

  template <class Executor>
  struct associated_executor<my_handler, Executor>
  {
    // Custom implementation of Executor type requirements.
    typedef my_executor type;

    // Return a custom executor implementation.
    static type get(const my_handler&, const Executor& = Executor())
    {
      return my_executor();
    }
  };

} } // namespace boost::asio

The boost::asio::bind_executor() function is a helper to bind a specific executor object, such as a strand, to a completion handler. This binding automatically specialises the associated_executor trait as shown above. For example, to bind a strand to a completion handler we would simply write:

my_socket.async_read_some(my_buffer,
    boost::asio::bind_executor(my_strand,
      [](error_code ec, size_t length)
      {
        // ...
      }));
See Also

bind_executor, strand, io_context::strand, tutorial Timer.5, HTTP server 3 example.


PrevUpHomeNext