std::mutex
和 std::lock_guard
是 C++ 标准库中用于多线程同步的工具,主要用于防止多个线程同时访问共享资源,导致数据竞争问题。
std::mutex
是一个用于互斥锁的类,提供了锁定(lock)和解锁(unlock)的功能。
使用方法:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void printMessage(const std::string& message) {
mtx.lock(); // 锁定互斥量
std::cout << message << std::endl;
mtx.unlock(); // 解锁互斥量
}
int main() {
std::thread t1(printMessage, "Hello from thread 1");
std::thread t2(printMessage, "Hello from thread 2");
t1.join();
t2.join();
return 0;
}
解释:
mtx.lock()
:锁定互斥量,使得其他线程在这段代码执行期间无法获得锁。mtx.unlock()
:解锁互斥量,允许其他线程获取锁。
注意,如果 lock()
和 unlock()
之间的代码抛出了异常,unlock()
可能不会被调用,从而导致死锁。因此,推荐使用 std::lock_guard
进行更安全的锁管理。
===============================================================================================================================
std::lock_guard
是一个 RAII(Resource Acquisition Is Initialization)类,自动管理互斥量的锁定和解锁,确保在作用域结束时(无论是正常结束还是异常退出)互斥量被正确解锁。
使用方法:
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void printMessage(const std::string& message) {
std::lock_guard<std::mutex> lock(mtx); // 自动锁定
std::cout << message << std::endl;
// 作用域结束时,lock_guard 自动解锁互斥量
}
int main() {
std::thread t1(printMessage, "Hello from thread 1");
std::thread t2(printMessage, "Hello from thread 2");
t1.join();
t2.join();
return 0;
}
解释:
std::lock_guard<std::mutex> lock(mtx);
:创建一个std::lock_guard
对象lock
,并传入互斥量mtx
。- 在创建
lock
对象时,互斥量mtx
被锁定,当lock
对象被销毁时(例如当函数退出或异常抛出时),互斥量自动解锁。
使用 std::lock_guard
的优点:
- 自动管理锁定和解锁,避免因异常或提前返回导致的死锁。
- 简洁的语法,更容易编写正确的并发代码。
标签:std,mtx,lock,C++,互斥,guard,include From: https://www.cnblogs.com/kitanoki/p/18384640