线程
线程的创建
在cpp中线程的创建有两种形式
- 默认构造
- 传入可调用对象如: 函数, 函数对象, 对象的成员函数, 对象的静态函数, lambda表达式
线程的构造函数会按值复制所有参数,这点很重要, 对于想要传递引用的变量时,要使用std::ref()
创建的格式如下
thread(_Callable&& __f, _Args&&... __args)
f是可调用对象, args是f的参数, 注意,当传递的是对象的成员函数时, args的第一个参数是对象的指针,原因很简单,想要调用对象的方法,总得知道是哪个对象吧
线程的返回值
线程的ff会被忽略,所以只能通过
- 传入一个参数的引用来保存, 使用
std::ref()) - 讲返回值保存到对象的成员变量
- 使用promise对象
其他
线程对象只能移动不能复制
线程结束需要主线程join()
关于ref()/cref()
由于cpp中的引用有很多的限制
- 不能有引用数组
- 容器内容不能是引用
- 不能有指针的引用
- 不能有引用的引用
但有很多函数需要传递引用, 比如bind, thread等,或者使用stl管理引用对象
所以通过std::ref()来创建一个std::reference_wrapper<T>对象, 这个对象中封装了一个裸指针, 从而实现了传递引用变量了
而cref就是const 引用了,