在C++ 11中,"不代表执行线程"的线程有什么意义?

pax*_*blo 41 c++ multithreading c++11

查看C++ 11中新的线程内容以查看它映射到pthreads的容易程度,我注意到thread构造函数区域中的奇怪部分:

线();
效果:构造一个不代表执行线程的线程对象.
后置条件: get_id()== id()
抛出:没什么.

换句话说,线程的默认构造函数实际上似乎并不创建线程.显然,它创建了一个线程对象,但是如果它没有支持代码那么它究竟有用吗?有没有其他方法可以将"执行线程"附加到该对象,如类似thrd.start()或类似的东西?

Luc*_*ton 37

有没有其他方法可以将"执行线程"附加到该对象,如thrd.start()或类似的东西?

// deferred start
std::thread thread;

// ...

// let's start now
thread = std::thread(functor, arg0, arg1);
Run Code Online (Sandbox Code Playgroud)

std::thread是MoveConstructible和MoveAssignable类型.因此,这意味着在代码std::thread zombie(some_functor); std::thread steal(std::move(zombie)); zombie中将保留在一个特殊但有效的状态,该状态与没有执行的线程相关联.默认构造函数在某种意义上是免费的,因为它所要做的就是将对象置于该确切状态.它还允许数组std::thread和操作std::vector<std::thread>::resize.


Nic*_*las 18

它意味着同样的事情:

 std::vector<int> emptyList;
Run Code Online (Sandbox Code Playgroud)

emptyList是空的.就像默认构造的一样std::thread.就像默认构造的std::ofstream不打开文件一样.有完全合理的理由让默认构造自己的类成为空状态.


如果你有一个空线程:

std::thread myThread;
Run Code Online (Sandbox Code Playgroud)

你可以通过这样做来实际启动线程:

myThread = std::thread(f, ...);
Run Code Online (Sandbox Code Playgroud)

哪些f是可调用的东西(函数指针,仿函数std::function等),并且...是要转发给线程的参数.


How*_*ant 8

不只是猜测:

"线程对象"是指a std::thread.

"执行线程"是指操作系统代表线程的硬件寄存器集合.

C++ 11除了通过操作系统的API访问操作系统线程以便使C++线程可以跨所有操作系统进行移植之外什么都不做.

线();
效果:构造一个不代表执行线程的线程对象.
后置条件: get_id()== id()
抛出:没什么.

这意味着构造的默认值std::thread不是指操作系统生成的执行线程.

A 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
Run Code Online (Sandbox Code Playgroud)