查看C ++ 11中新的线程内容,看看它映射到pthreads的容易程度,我注意到thread
构造函数区域中的奇怪部分:
螺纹();
效果:构造一个不代表执行线程的线程对象 后置条件: get_id()== id()
投掷:没什么。
换句话说,线程的默认构造函数实际上似乎创建一个线程。显然,它创建了一个线程对象,但是如果没有支持代码,它究竟是多么有用呢?有没有其他方法可以将“执行线程”附加到该对象,如thrd.start()
或类似的东西?
答案 0 :(得分:35)
还有其他方法可以将“执行线程”附加到该对象,例如thrd.start()或类似的东西吗?
// deferred start
std::thread thread;
// ...
// let's start now
thread = std::thread(functor, arg0, arg1);
std::thread
是MoveConstructible和MoveAssignable类型。这意味着像std::thread zombie(some_functor); std::thread steal(std::move(zombie));
zombie
这样的代码将保留在一个特殊但有效的状态中,该状态与没有执行的线程相关联。默认构造函数在某种意义上是免费的,因为它所要做的就是将对象置于该确切状态。它还允许std::thread
数组和std::vector<std::thread>::resize
等操作。
答案 1 :(得分:18)
这意味着同样的事情:
std::vector<int> emptyList;
emptyList
为空。就像默认构造的std::thread
一样。就像默认构造的std::ofstream
不会打开文件一样。有完全合理的理由让默认构造自己的类成为空状态。
如果您有空线程:
std::thread myThread;
你可以通过这样做来实际启动线程:
myThread = std::thread(f, ...);
f
是一些可调用的东西(函数指针,仿函数,std::function
等),而...
是要转发给线程的参数。
答案 2 :(得分:8)
不只是猜测:
“线程对象”是指std::thread
。
“执行线程”是指OS's collection of hardware registers that represent a thread。
C ++ 11除了通过操作系统的API访问操作系统线程以便使C ++线程可以在所有操作系统中移植之外什么都不做。
<强>螺纹(); 强>
效果:构造一个不代表执行线程的线程对象 后置条件: get_id()== id()
投掷:没什么。
这意味着默认构造的std::thread
不会引用操作系统生成的执行线程。
可以为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
答案 3 :(得分:3)
只是猜测,但它只是意味着线程没有启动。换句话说,它只是一个像任何其他对象一样的对象 - 它背后不一定有实际的OS线程。换句话说,如果线程是在pthreads之上实现的,那么创建一个C ++ 11线程对象并不一定会调用pthread_create() - 只需要在线程启动时发生。