原文轉自 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