C++11 创建一个线程

#include <thread>

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

	}
private:
	std::thread  taskThread_;
};

如代码所示,方法Start启动一个线程,线程执行本类的另一个方法Work。线程的入口函数是一个本类的方法,这方法内可以直接使用其他的成员变量和成员方法。有很多代码使用Win32的API CreateThread创建线程,但在CreateThread创建的线程内使用C运行时的某些函数不安全,所以不推荐。

这块代码使用了C++11的bind函数。这个函数定义在functional头文件。因为thread的构造函数可接受一个可调用对象参数。这个bind函数创建的就是一个可调用对象,可以理解为这个对象内存放一个函数指针和若干参数。在这里的效果是,线程调用Work,并把100和‘a’传递给Work。之所以传递一个this参数,是因为成员函数第一个隐含参数是this。另外bind的第一个参数,需传递一个函数指针,普通函数和类的静态函数可以传函数名或在前面加上&,但要获取实例方法的地址一定要采用&class_name::fun的形式。不一定要使用bind,可以替换为:taskThread_=std::thread(&SomeTask::Work,this,100,'a');

taskThread_ = std::thread(std::bind(&SomeTask::Work,this,100,'a'));左边的对象(taskThread_)是默认的thread构造函数创建的,所以没有包含线程。右边的构造函数传递了参数,所以创建了新的线程,这个线程与新建的这个thread对象是绑定的。=运算符是移动赋值函数定义的(C++11新加的一种赋值函数),会把线程与右边创建的线程解绑,并把线程与taskThread_绑定。

猜你喜欢

转载自blog.csdn.net/weixin_41855721/article/details/81784412