C++11 創建一個線程

#include <thread>

class SomeTask
{
public:
	void Start()
	{
		if (taskThread_.get_id() == std::thread::id())
		{
			taskThread_ = std::thread(&SomeTask::Work,this,100,'a');
		}
	}
private:
	void Work(int n , char c)
	{

	}
private:
	std::thread  taskThread_;
};

如代碼所示,方法Start啓動一個線程,線程執行本類的另一個方法Work。

thread的第一個構造函數爲無參構造函數:thread() _NOEXCEPT; 上面代碼的std::thread  taskThread_;就是一個例子。這個對象內部不包含線程。可以認爲這樣的對象只是一個空殼而已。

thread的第二個構造函數:template<class Fn,class... Args> explicit thread(Fn&& F,Args&&... A); 模板參數F處可以傳遞一個可調用對象作爲實參,本例中是成員函數Work。A是一個可變模板參數,可以傳遞任意個實參。本里中傳遞了三個。

模板參數A處,應傳入一個可調用對象作爲實參。本例中使用了函數的指針。對於普通的全局函數或者類的靜態函數,函數名或者函數名取地址(Fun、SomeClass::Fun或&Fun、&SomeClass::Fun)得到的都是函數的指針。因爲不管是否加&符號,獲得的都是這個函數的地址(雖然值都是函數的地址,但不帶&時類型是函數,帶上&則是函數指針)。對於類的實例函數,必須採用&SomeClass::Fun的形式。如果捨去&,得到的不是這個函數的地址。

再分析taskThread_ = std::thread(&SomeTask::Work,this,100,'a');中的“=”(移動賦值操作符)。左值:taskThread_,右值:臨時對象,thread的有參構造函數創建。如前所述,左值不包含線程,右值包含線程。在=操作符的作用下,左值獲取的右值的線程,右值成了一個空殼。

爲什麼把線程轉移給taskThread_呢?因爲taskThread_的生存期長,爲了保證包含線程的thread對象不被析構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章