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

In C++11, what is the point of a thread which "does not represent a thread of execution"?

本文关键字:线程 什么 C++11 执行      更新时间:2023-10-16

查看c++ 11中新的线程功能,看看它如何容易地映射到pthreads,我注意到thread构造函数区域中奇怪的部分:

线程();
Effects:构造一个不代表执行线程的线程对象。
后置条件: get_id() == id()
抛出:

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

是否有其他方式可以将"执行线程"附加到该对象,如thread .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的操作。

它的意思与以下相同:

 std::vector<int> emptyList;

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


如果你有一个空线程:

std::thread myThread;

你可以这样启动线程:

myThread = std::thread(f, ...);

其中f是一些可调用的东西(函数指针、函子、std::function等),...是要转发给线程的参数

不只是猜测:

"线程对象"指的是一个std::thread

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

c++ 11只是将操作系统的API用于访问操作系统线程,以使c++线程可移植到所有操作系统。

线程();
Effects:构造一个不代表执行线程的线程对象。
后置条件: get_id() == id()
抛出:

这意味着默认构造的std::thread不指向操作系统产生的执行线程。

std::thread可以被赋一个新值,然后通过move赋值语句开始指向一个正在执行的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

只是猜测,但这仅仅意味着线程没有启动。换句话说,它只是一个像其他对象一样的对象——它背后不一定有一个实际的操作系统线程。换句话说,如果线程是在pthread之上实现的,那么创建一个c++ 11线程对象并不一定需要调用pthread_create()——这只需要在线程启动时发生。