3. 转移线程所有权

转移线程的所有权

  • C++中有很多资源占用类型,例如std::ifstreamstd::unique_ptr,std::thread都是可以移动,但是不能拷贝的
void func1();
void func2();
std::thread t1(func1);
std::thread t2 = std::move(t1);
t1 = std::thread(func2);
std::thread t3;
t3 = std::move(2);
t1 = std::move(t3) //赋值操作会使得程序崩溃

在最后一次调用的使用,由于t1已经有了关联线程,所以系统直接调用std::terminate()终止程序继续运行


  • 由于std::thread 支持移动,这就意味这线程的所有权可以在函数外进行转移,如下所示
std::thread f(){
	void do_work();
	return std::thread(do_work());
}
std::thread g(){
	void do_work2(int num);
	std::thread t(do_work2, 42);
	return t;
}

当所有权在函数内部传递的时候,允许std::实例作为参数进行传递

void f(std::thread t);
void g(){
	void dowork();
	f(std::thread(dowork));
	std::thread t(dowork);
	f(std::move(t))
}

std::thread对象支持移动的好处是可以创建thread_guard类实例

class thread_gurad{
private:
	thread t;
public:
	thread_guard(thread t_):t(move(t_)){
		if(!t.joinable())
			throw;
	}
	~thread_gurard(){
		t.join();
	}
	thread_guard(thread_guard const & ) = delete;
	thread_guard & operator=(thread_guard const &) = delete;
}
posted @ 2023-01-03 16:55  ^江流儿^  阅读(41)  评论(0)    收藏  举报