在C ++ 11中,“不代表执行线程”的线程有什么意义?
在C ++ 11中查看新线程的东西,看看它是如何轻松映射到pthread,我注意到thread构造函数区域中的好奇的部分: 
线();
效果:构造一个不代表执行线程的线程对象。
后置条件: get_id()== id()
抛出:没有。
 换句话说,一个线程的默认构造函数实际上并不会创build一个线程。 很显然,它创build了一个线程对象,但是如果没有后台代码,那么它究竟有用呢? 有没有其他方式可以将“执行线程”附加到该对象,如thrd.start()或类似的东西? 
有没有其他方式可以将“执行线程”附加到该对象,如thrd.start()或类似的东西?
 // deferred start std::thread thread; // ... // let's start now thread = std::thread(functor, arg0, arg1); 
  std::thread是一个MoveConstructible和MoveAssignabletypes。 所以这意味着在代码中像std::thread zombie(some_functor); std::thread steal(std::move(zombie)); std::thread zombie(some_functor); std::thread steal(std::move(zombie));  zombie将被留在一个特殊的,但有效的状态,没有执行的线程。 默认的构造函数在某种意义上是免费的,因为它所要做的就是将对象置于精确的状态。 它也允许std::thread和像std::vector<std::thread>::resize 。 
这意味着与此相同的事情:
  std::vector<int> emptyList; 
  emptyList是空的。 就像一个默认构造的std::thread 。 就像默认构build的std::ofstream不打开文件一样。 有一些完全合理的理由让类缺省构造成一个空的状态。 
如果你有一个空的线程:
 std::thread myThread; 
你可以通过这样做来启动线程:
 myThread = std::thread(f, ...); 
 其中f是一些可调用的东西(函数指针,函数, std::function等)和...是要转发给线程的参数。 
不只是猜测:
  “线程对象”是指一个std::thread 。 
“执行线程”是指OS代表线程的硬件寄存器的集合 。
C ++ 11除了通过操作系统的API来访问操作系统线程外,没有做任何事情,为了使C ++线程可以跨所有操作系统移植。
线();
效果:构造一个不代表执行线程的线程对象。
后置条件: get_id()== id()
抛出:没有。
 这意味着默认构造的std::thread不会引用OS产生的执行线程。 
 一个std::thread可以被赋予一个新的值,从而开始通过移动赋值语句引用一个OS执行线程: 
 std::thread t; // Does not refer to an OS thread //... t = std::thread(my_func); // t refers to the OS thread executing my_func 
只是猜测,但它只是意味着线程没有启动。 换句话说,它只是一个像其他任何东西一样的对象 – 它并不一定是一个真正的操作系统线程。 换句话说,如果线程是在pthreads之上实现的,那么创build一个C ++ 11线程对象并不一定会调用pthread_create() – 只有当线程启动时才需要这个线程。