1. 程式人生 > >C++11 自動釋放鎖

C++11 自動釋放鎖

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;
}