読者です 読者をやめる 読者になる 読者になる

C++1z lock_guardの可変引数化

C++

関数内でロックを取得したミューテックスを、関数の終わりで確実にロックを手放すstd::lock_guard<MutexType>クラスですが、C++1zから可変個のミューテックス型およびミューテックスオブジェクトをとれるようになります。

std::mutex m1;
std::timed_mutex m2;
std::shared_timed_mutex m3;
void f()
{
    std::lock_guard<std::mutex, std::timed_mutex, std::shared_timed_mutex> lk
    {
        m1, m2, m3
    };

    // ...共有リソースに対する操作...
} // ここでm1, m2, m3のunlock()メンバ関数が呼ばれる

std::lock_guardのテンプレート引数は、1つ以上指定する必要があります。

ロック取得済みのミューテックスオブジェクトであることを指示するstd::adopt_lockは、std::lock_guardコンストラクタの最後の引数に指定します。

std::lock(m1, m2, m3);
std::lock_guard<std::mutex, std::timed_mutex, std::shared_timed_mutex> lk
{
    m1, m2, m3, std::adopt_lock
};

ミューテックスオブジェクトに個別で「これはロック取得済み、これはロック取得していない」というような指定はできません。

std::shared_lockクラスの方は、可変引数化の対応はありません。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。