yohhoyの日記

技術的メモをしていきたい日記

Boost.Asioのstrand

Boost.Asioライブラリが定義・提供する strand についてメモ。

Boost.Asioライブラリが定義する概念上の「ストランド(strand)*1」と、直列化プリミティブとしての「io_service::strandクラス」の混同に注意。

ストランド(strand)
逐次実行されるイベントハンドラ呼び出しの連なり。(並列実行されない)イベントハンドラの連鎖的な呼び出しによる “暗黙的ストランド” と、io_service::strandクラスを用いた “明示的ストランド” に分類される。
io_service::strandクラス
単一io_service&マルチスレッド構造*2で “明示的ストランド” を実現するためのプリミティブ。明示的ストランドによって、結果的にマルチスレッド間の(暗黙的な)排他制御として機能する。

Boost.Asio 1.51.0のドキュメントより一部引用(下線部は強調)。

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:

  • Calling io_service::run() from only one thread means all event handlers execute in an implicit strand, due to the io_service's guarantee that handlers are only invoked from inside run().
  • Where there is a single chain of asynchronous operations associated with a connection (e.g. in a half duplex protocol implementation like HTTP) there is no possibility of concurrent execution of the handlers. This is an implicit strand.
  • An explicit strand is an instance of io_service::strand. All event handler function objects need to be wrapped using io_service::strand::wrap() or otherwise posted/dispatched through the io_service::strand object.
Overview - Strands: Use Threads Without Explicit Locking

*1:"strand"の直訳は 撚り線、繊維、鎖 などの意。類似概念の並行処理プリミティブ「スレッド;thread=糸、すじ」や「ファイバー;fiber=繊維、ほそ糸」から名付けたと推測される。

*2:ここでは複数スレッドで同じ io_service オブジェクトを共有し、各スレッド上で io_service::run メンバ関数を呼び出す構造を指す。