(1)std::mutex
是 C++ 标准库中提供的一种用于多线程同步的互斥锁实现。
mutex 用于控制多个线程访问共享资源,确保在任意时刻只有一个线程可以访问该资源,避免数据竞争。线程在访问共享资源之前首先需要锁住 std::mutex
,然后在完成操作后释放锁。这确保了同一时刻只有一个线程可以访问被保护的资源,从而防止多线程并发访问导致的数据不一致性。
(2)std::lock_guard
是 C++ 标准库中提供的一个模板类,用于在其构造时自动获取锁,在析构时自动释放锁。使用 std::lock_guard
的好处是,当 std::lock_guard
对象离开其作用域时,会自动调用析构函数,该析构函数会释放锁。这确保了在任何情况下(包括由于异常等原因导致的提前退出),锁都会被正确释放,从而避免了忘记手动释放锁而导致的死锁问题。
多个线程修改共享数据时,可以这样写:
--------------------------------------------------------
std::mutex myMutex;
共享数据 data;
func(){
std::lock_guard<std::mutex>lock(myMutex);
修改共享数据;
}
-----------------------------------------------
<std::mutex>
模板参数,指定了std::lock_guard
应该使用何种类型的锁。lock(myMutex)
: 这是std::lock_guard
的构造函数,它接受一个互斥锁作为参数,并在构造时锁定该互斥锁。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex myMutex;
int sharedData = 0;
void modifySharedData(int threadId) {
// 使用锁保护共享数据
std::lock_guard<std::mutex> lock(myMutex);
// 修改共享数据
sharedData++;
std::cout << "Thread " << threadId << " modified sharedData: " << sharedData << std::endl;
// 离开作用域时,锁会自动释放
}
int main() {
const int numThreads = 3;
std::thread threads[numThreads];
for (int i = 0; i < numThreads; ++i) {
threads[i] = std::thread(modifySharedData, i + 1);
}
for (int i = 0; i < numThreads; ++i) {
threads[i].join();
}
std::cout << "Final value of sharedData: " << sharedData << std::endl;
return 0;
}
有三个线程同时修改一个共享的整数变量 sharedData
。通过使用 std::mutex
,我们确保了每个线程在修改 sharedData
时都先获取了锁,从而避免了竞争条件。