C++11 自动释放锁(转)
原文转自 https://blog.csdn.net/lmb1612977696/article/details/77712170
c++11加入了很多新的特性,值得我们去探索。
先看一个例子:普通的、不能自动的释放自己的锁
#include <iostream> /*std::cout*/ #include <thread> /*std::thread*/ #include <functional> /*std::bind*/ #include <unistd.h> /*usleep*/ #include <mutex> /*std::mutex、 std::lock_guard*/ class Test{ public: Test() : i(1) {} void run1(){ while(1){ Fun1(); usleep(1000); } } void run2(){ while(1){ Fun2(); usleep(1000); } } void Fun1(){ mutex.lock(); std::cout << "Fun1->" << i++ <<std::endl; mutex.unlock(); } void Fun2(){ mutex.lock(); std::cout << "Fun2->" << i++ <<std::endl; mutex.unlock(); } private: int i; std::mutex mutex; }; int main(int argc, char *argv[]) { Test test; std::thread t1(std::bind(&Test::run1,&test)); std::thread t2(std::bind(&Test::run2,&test)); t1.join(); t2.join(); return 0; }
借助对象的析构函数自动调用的原理,c++11推出了std::lock_guard自动释放锁,其原理是:声明一个局部的lock_guard对象,在其构造函数中进行加锁,在其析构函数中进行解锁。最终的结果就是:在定义该局部对象的时候加锁(调用构造函数),出了该对象作用域的时候解锁(调用析构函数)。
#include <iostream> /*std::cout*/ #include <thread> /*std::thread*/ #include <functional> /*std::bind*/ #include <unistd.h> /*usleep*/ #include <mutex> /*std::mutex、 std::lock_guard*/ class Test{ public: Test() : i(1) {} void run1(){ while(1){ Fun1(); usleep(1000); } } void run2(){ while(1){ Fun2(); usleep(1000); } } void Fun1(){ std::lock_guard<std::mutex> lock(mutex); std::cout << "Fun1->" << i++ <<std::endl; } void Fun2(){ std::lock_guard<std::mutex> lock(mutex); std::cout << "Fun2->" << i++ <<std::endl; } private: int i; std::mutex mutex; }; int main(int argc, char *argv[]) { Test test; std::thread t1(std::bind(&Test::run1,&test)); std::thread t2(std::bind(&Test::run2,&test)); t1.join(); t2.join(); return 0; }
如果想对C++锁进行进一步的研究,请参考 https://www.cnblogs.com/diegodu/p/7099300.html