C++11 自動釋放鎖
阿新 • • 發佈:2018-12-30
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; }