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両者で提供:通常のミューテックス
mutex
、再帰ロック可能なミューテックスrecursive_mutex
、タイムアウト付き待機ミューテックスtimed_mutex
、再帰ロック可能かつタイムアウト付き待機ミューテックスrecursive_timed_mutex
。および対応するロックオブジェクト群。 C++11でのみ提供:*2[Boost.Thread 1.49.0以前]lock
,unlock
のみ要求するBasicLockable要件を定める。参考:Lockable要件=BasicLockable要件+try_lock
を要求。- 2012-11-08追記:Boost.Thread 1.50.0からBasicLockable要件が追加されている。
- Boostでのみ提供:共有ミューテックス
shared_mutex
と、対応するロックオブジェクト群。いわゆるReader/Writerミューテックス。
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
- mutexいろいろ - Garbage Collection
- くまメモ - 2010-12-27
- boost@lists.boost.org - Re: [thread] On shared_mutex
*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 と組み合わせ可能なことを保証している。