std::scoped_lock和
std::lock() 同时锁多个mutex
std::scoped_lock
和 std::lock()
都是 C++ 标准库中用于管理多个 std::mutex
对象的工具,但它们在使用方式和一些方面上存在一些区别。以下是它们的主要区别:
-
用法差异:
std::scoped_lock
是一个模板类,你需要将要锁定的所有std::mutex
作为参数传递给它的构造函数。它会在构造时锁定所有提供的互斥量,而在析构时自动释放这些锁。
std::mutex mtx1; std::mutex mtx2; { std::scoped_lock lock(mtx1, mtx2); // 锁定 mtx1 和 mtx2 // 在这个作用域内,mtx1 和 mtx2 都已经被成功锁定 } // 在这个作用域结束时,mtx1 和 mtx2 会被解锁支持RAII
std::lock()
是一个函数,接受任意数量的std::mutex
参数,并在一次函数调用中尽可能地同时锁定所有提供的互斥量。这可以避免死锁,并且比分别调用std::lock_guard
或std::unique_lock
更高效。
std::mutex mtx1; std::mutex mtx2; std::lock(mtx1, mtx2); // 锁定 mtx1 和 mtx2 //需要手动解锁,不支持RAII
-
死锁避免:
std::lock()
在一次函数调用中尝试锁定所有提供的互斥量,如果无法同时锁定,会产生std::system_error
异常。因此,在使用std::lock
时,确保所有互斥量都是可锁定的,否则会导致程序异常终止。std::scoped_lock
在构造时就锁定了所有提供的互斥量,如果无法同时锁定会产生std::system_error
异常。因此,在使用std::lock
时,确保所有互斥量都是可锁定的,否则会导致程序异常终止。
在C++中,条件变量(Condition Variable)是用于线程间同步的一种机制。条件变量通常与互斥锁结合使用,用于实现线程的等待和唤醒机制,以确保线程在满足某些条件时才能执行。
常用的条件变量相关的类有 std::condition_variable
和 std::condition_variable_any
。以下是简要介绍和使用条件变量的基本模式:
条件变量
std::condition_variable
使用示例:
#include <iostream>
#include <thread>