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对象不被析构。

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