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:
Overview - Strands: Use Threads Without Explicit Locking
- 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 usingio_service::strand::wrap()
or otherwise posted/dispatched through theio_service::strand
object.