1、std:mutex
在了解lock_guard之前,需要先学习下std:mutex,因为lock_guard内部就是使用的std:mutex
std:mutex:是一个用于保护共享数据不会同时被多个线程访问的类,它叫做互斥量。我们可以把它看作一把锁,基本使用如下:
#include <mutex>
std::mutex kMutex;
void function() {
//加锁
kMutex.lock();
//kMutex.try_lock();
//do something that is thread safe...
// 离开作用域解锁
kMutex.unlock();
}
来看一个例子,两个线程共同访问一个全局变量
首先我们实现一个不加锁的看看有什么问题:
#include <iostream>
#include <thread>
int gData = 0;
std::mutex kMutex;
void increment(){
for (int i = 0; i < 1000000; i++) {
gData++;
std::cout<< std::this_thread::get_id() << ":"<< gData << std::endl;
}
}
int main() {
std::cout<< __FUNCTION__ << ":" << gData << std::endl;
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
getchar();
return 0;
}
输出:

可以看到,结果并不是我们所期望的,那么我们使用mutex加上锁之后看下:

文章介绍了C++中std::mutex互斥量的作用,用于保护多线程环境中的共享数据,防止并发访问导致的问题。std::lock_guard是std::mutex的智能包装器,自动处理锁定和解锁,避免了手动管理锁可能导致的资源泄露。通过示例展示了未加锁和使用std::lock_guard后的程序行为差异,证明了std::lock_guard在确保线程安全方面的效果。
最低0.47元/天 解锁文章
2939

被折叠的 条评论
为什么被折叠?



