boost::reverse_lock

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