3. 转移线程所有权
转移线程的所有权
- C++中有很多资源占用类型,例如
std::ifstream
,std::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;
}
本文作者:^江流儿^
本文链接:https://www.cnblogs.com/hhyandcpp/p/17022767.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步