线程

线程的创建

在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 引用了,