移动语义
在讨论转移线程所有权之前,先来看之前提到的例子:
之前我们说到,向线程过程函数传递参数,是值传递,如果想改为引用传递,那么改为:
std::thread t1(func, std::ref(str));
现在考虑一个问题,假如 str 不会再在主线程中使用了,为了避免数据竞争或者说无用的空间占用,我们可以使用移动语义来将 str 的所有权从主线程移动到子线程,然后去执行 func 函数
std::thread t1(func, std::move(str));
此时,如果再输出 str 的值,那么应当为空
可以看到,这里的“移动”,指的是将原始对象中的数据所有权转移,转移以后,原始对象中的数据就不复存在了。同样拥有转移语义特性的,我们以前见过,还有:
- unique_ptr:同一时间只允许 unique_ptr 指向一个对象,当这个 unique_ptr 销毁的时候,指向的对象也将销毁
- std::ifst