Boost.Threadでは、いろいろなロック取得戦略のためのクラスが用意されています。今回はboost::reverse_lockクラスを見てみます。
boost::reverse_lockクラスは、lock_guardの「コンストラクタでlock、デストラクタでunlockする」というのとは逆に、「コンストラクタでunlock、デストラクタでlockする」ということを行います。
#include <iostream> #include <boost/thread.hpp> #include <boost/thread/reverse_lock.hpp> int main() { boost::mutex mtx; boost::unique_lock<boost::mutex> lk(mtx); { boost::reverse_lock<decltype(lk)> rlk(lk); // ロックを一旦解除 std::cout << std::boolalpha << lk.owns_lock() << std::endl; } // 再ロック std::cout << std::boolalpha << lk.owns_lock() << std::endl; }
false true
こういうロック戦略は、たとえば条件変数で使われています。condition_variableのwait系関数は、関数に入るとunlockしてnotifyされるのを待ち、関数を抜ける際に再度lockします。
参照:
reverse_lock - Boost Thread Library
condition_variable::wait() - cpprefjp