C++ の unique_lock をどのように使うのですか?
unique_lockは、スレッドの同期と排他制御を実現するC++標準ライブラリの排他制御ラッパークラスであり、排他制御を管理するより柔軟な方法を提供し、より多くの機能とオプションをlock_guard以上に提供します.
unique_lockの使い方は次の通りです。
- mutexオブジェクトとunique_lockオブジェクトを作成します:
std::mutex mtx;
std::unique_lock<std::mutex> lock(mtx);
- ロック付きミューテックス
lock.lock(); // 或者使用构造函数时传入std::defer_lock参数创建未加锁的unique_lock对象
- 排他ロックの解除:
lock.unlock();
- ミューテックスを再ロックします。
lock.lock();
- std::lock_guardのlock()とunlock()メソッドを使用すると、自動ロックとロック解除を実装できます。
std::lock_guard<std::mutex> lock(mtx); // 自动加锁
- std::adopt_lockパラメータを使用してロック済みのunique_lockオブジェクトを作成するには、
std::unique_lock<std::mutex> lock(mtx, std::adopt_lock); // 创建已加锁的unique_lock对象
- std::try_to_lockの引数を使って排他制御を排他制御しようとし、排他制御が他のスレッドによってすでにロックされている場合、現在のスレッドをブロックせず、falseを返します:
std::unique_lock<std::mutex> lock(mtx, std::try_to_lock);
if (lock.owns_lock()) {
// 互斥量已被当前线程加锁
}
else {
// 互斥量已被其他线程加锁
}
- 未ロックされたunique_lockオブジェクトを作成するにはstd::defer_lockパラメーターを使用し、適切なタイミングで手動でロックします。
std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
// 执行一些操作
lock.lock(); // 加锁
// 执行另一些操作
lock.unlock(); // 解锁
unique_lockは柔軟性と制御性をさらに提供し、必要に応じて適切なロック方式を選択できます。また、unique_lockは条件変数の使用をサポートしており、条件を待つ際に排他ロックを一時的に解除して不要なブロックを回避できます。