在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() – 只有当线程启动时才需要这个线程。