名前空間
変種
操作

std::lock_guard

提供: cppreference.com
< cpp‎ | thread
 
 
スレッドサポートライブラリ
スレッド
(C++11)
(C++20)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
相互排他
(C++11)
汎用ロック管理
lock_guard
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
フューチャー
(C++11)
(C++11)
(C++11)
(C++11)
 
std::lock_guard
 
ヘッダ <mutex> で定義
template< class Mutex >
class lock_guard;

クラス lock_guard はスコープ付きブロックの期間に対してミューテックスを所有するための便利な RAII スタイルの仕組みを提供するミューテックスラッパーです。

lock_guard オブジェクトが作成されると、指定されたミューテックスの所有権の取得が試みられます。 lock_guard オブジェクトが作成されたスコープから制御が離れると、 lock_guard は破壊され、ミューテックスは解放されます。

lock_guard クラスはコピー可能ではありません。

目次

[編集] テンプレート引数

Mutex - ロックするミューテックスの型。 BasicLockable の要件を満たさなければなりません

[編集] メンバ型

メンバ型 定義
mutex_type Mutex

[編集] メンバ関数

lock_guard を構築し、オプションで指定されたミューテックスをロックします
(パブリックメンバ関数) [edit]
lock_guard オブジェクトを破壊し、ミューテックスのロックを解除します
(パブリックメンバ関数) [edit]
operator=
[削除]
コピー代入可能ではありません
(パブリックメンバ関数) [edit]

[編集]

#include <thread>
#include <mutex>
#include <iostream>
 
int g_i = 0;
std::mutex g_i_mutex;  // protects g_i
 
void safe_increment()
{
    const std::lock_guard<std::mutex> lock(g_i_mutex);
    ++g_i;
 
    std::cout << std::this_thread::get_id() << ": " << g_i << '\n';
 
    // g_i_mutex is automatically released when lock
    // goes out of scope
}
 
int main()
{
    std::cout << "main: " << g_i << '\n';
 
    std::thread t1(safe_increment);
    std::thread t2(safe_increment);
 
    t1.join();
    t2.join();
 
    std::cout << "main: " << g_i << '\n';
}

出力例:

main: 0
140641306900224: 1
140641298507520: 2
main: 2

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2981 C++17 redundant deduction guide from lock_guard<Mutex> was provided removed

[編集] 関連項目

ムーブ可能なミューテックスの所有権のラッパーを実装します
(クラステンプレート) [edit]
複数のミューテックスに対するデッドロック回避機能付きの RAII ラッパー
(クラステンプレート) [edit]