yohhoyの日記

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

C++11とBoost.ThreadのMutex/Lock比較表

C++11標準ライブラリで新たに追加された排他制御ライブラリ/標準ヘッダ<mutex>と、Boost.Threadライブラリ 1.49.0の比較一覧表。

C++11とBoost.Threadライブラリでは、いくつかのLockable要件(requirements)*1を定義し、各種Mutex型およびLockオブジェクトを提供する。

Lockable要件
排他制御(mutual exclusion)として機能する型に対する要件。特定の型を指すわけではない。例えば「ロック獲得操作を行うlockメンバ関数とロック解放操作を行うunlockメンバ関数を有する」など。
Mutex型
Lockable要件を満たす、実際に排他制御として機能する型。どのLockable要件を満たすかに応じて異なる型が提供される。
Lockオブジェクト
RAIIイディオムによって確実にロック解放操作を行うためのオブジェクト。Mutex型をテンプレート引数にとるクラステンプレートの形で提供される。例外安全の観点から常に利用することが望ましい。

まとめ

C++11 Boost.Thread
Lockable要件 BasicLockable
Lockable
TimedLockable
BasicLockable[1.50.0以降]
Lockable
TimedLockable
SharedLockable
UpgradeLockable
Mutex型 std::mutex
std::recursive_mutex
std::timed_mutex
std::recursive_timed_mutex
boost::mutex
boost::timed_mutex
boost::recursive_mutex
boost::recursive_timed_mutex
boost::shared_mutex
Lock std::lock_guard
std::unique_lock
boost::lock_guard
boost::unique_lock
boost::shared_lock
boost::upgrade_lock
boost::upgrade_to_unique_lock

関連URL

*1:Boost.Threadマニュアルでは "Mutex Concepts" と呼称している。

*2:C++11標準ライブラリが提供する最も単純な std::mutex でもLockable要件を満たすため、BasicLockable要件のみを満たすMutex型は直接提供されない。BasicLockable要件は、クラステンプレート std::lock_guard<Mutex> のテンプレート引数型に対する要件として定義されている。これはユーザ定義の排他制御オブジェクトがBasicLockable要件しか満たさない(lock, unlock のみ提供し try_lock 提供なし)場合でも、std::lock_gurard と組み合わせ可能なことを保証している。