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