`std::lock_guard` 是 C++ 中用于管理 `std::mutex` 的 RAII(Resource Acquisition Is Initialization) 类之一。它的主要作用是帮助在获取 `std::mutex` 的所有权时自动对其进行加锁,并在作用域结束时自动解锁,从而避免了手动管理锁的加锁和解锁过程,有效地防止了忘记解锁锁的情况,提高了代码的安全性和可维护...
#include<iostream>#include<mutex>#include<thread>#include<windows.h>//全局变量,两个线程都会访问intg_num =0;//定义锁std::mutex m_mutex;voidbar(){//函数bar()范围内,自动为互斥量上锁和解锁std::lock_guard<std::mutex>LockGuard(m_mutex); ...
指的就是接受锁的所有权,通过这个参数的制定之后,std::lock_guard在构造函数中接受锁的时候,只会记录锁的信息不会对锁进行加锁操作。该RAII对象会在析构的时候对锁进行解锁。这里之所以这么使用因为锁已经在std::lock函数中实现了加锁操作,不需要在这个RAII对象中再次进行加锁操作...
std::lock_guard<std::mutex> guard(myMutex); 请注意 lock_guard 引用了 全局 互斥锁 myMutex 。也就是说,所有三个线程都使用相同的互斥锁。 lock_guard 所做的基本上是这样的: 在构建时,它会锁定 myMutex 并保留对它的引用。 销毁后(即当守卫的范围离开时),它会解锁 myMutex。 互斥锁始终是同一个...
//函数bar()范围内,自动为互斥量上锁和解锁 std::lock_guard<std::mutex> LockGuard(m_mutex); std::cout << "This thread id is : " << std::this_thread::get_id() << " -- g_num : " << g_num << std::endl; g_num++; ...
根据对象的析构函数自动调用的原理,c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁。最终的结果就是:在定义该局部对象的时候加锁(调用构造函数),出了该对象作用域的时候解锁(调用析构函数)。
std::lock_guard<>、std::unique_lock<>以及std::scoped_lock<>之间的主要差异: 说明 自动解锁:这些锁在作用域结束时自动解锁,减少了忘记解锁的风险。 可复制性:所有这三种锁都是不可复制的,但std::unique_lock<>和std::scoped_lock<>支持通过移动语义进行所有权转移。
C++11中加入了线程,引入了多线程,也就伴随着一个多线程资源互斥的操作。对于锁的使用,有一个比较头疼的问题,就是在加锁后,容易忘记解锁,这样程序中可能会造成死锁。C++11中加入了lock_guard,这个的使用,可以让你不用关注解锁! 原理是这样的:这个是利用了C++的特性(析构函数),用法是在函数开始的地方声明一个loc...
std::lock_guard类的构造函数禁用拷贝构造,且禁用移动构造。std::lock_guard类除了构造函数和析构函数外没有其它成员函数。 在std::lock_guard对象构造时,传入的mutex对象(即它所管理的mutex对象)会被当前线程锁住。在lock_guard对象被析构时,它所管理的mutex对象会自动解锁,不需要程序员手动调用lock和unlock对mutex...
最近在项目总结过程中,发现项目大量使用了std::lock_guard这个模板类,仔细分析后发现这个类牵扯到了很多重要的计算机基础,例如:多线程,互斥,锁等等,这里便记录下来,也算是一次简单的总结。 std::lock_guard 简介 这个类是一个互斥量的包装类,用来提供自动为互斥量上锁和解锁的功能,简化了多线程编程,用法如下: ...