std::线程构造和执行

std::thread construction and execution

本文关键字:执行 线程 std      更新时间:2023-10-16

如果可以保证线程在线程对象构造完成后实际运行,我在文档中找不到任何信息。换句话说,是否可以保证线程构造函数完成后线程函数已经在执行?如有参考,不胜感激。

否,不能保证在std::thread构造函数完成时线程已经开始执行。所有可以保证的是,它被安排执行,因此在调用构造函数后的某个时刻,线程将运行,并且它将在对相关std::thread对象的join()的调用返回之前完成。

有没有保证在线程构造函数完成之后线程函数已经在执行

C++标准不能要求这样做。

它取决于操作系统、进程调度程序和当前系统负载。当thread构造函数返回时,线程有时已经开始执行,有时还没有。

不过,新线程可以让您的父线程知道它是否已经开始执行,但仍使用IPC,例如信号、管道或互斥对象和条件变量。

来自C++11,30.3.1.2/4,关于您提到的thread构造函数:

template <class F, class ...Args> explicit thread(F&& f, Args&&... args);

效果:构造thread类型的对象。执行的新线程执行INVOKE (DECAY_COPY(std::forward<F>(f)), DECAY_COPY(std::forward<Args>(args))...),并且在构造线程中评估对DECAY_COPY的调用。此调用的任何返回值都将被忽略。

"运行"是什么意思?可以保证自变量将被复制,至少在大多数系统上,复制必须在新创建的线程中进行。但是意义不大。就这一点而言,什么意义重大?新创建的线程执行一台机器从构造函数返回之前的指令?就是这样是否执行了完整的C++语句?还是怎样

在C++标准中不可能有这样的保证,因为创建的线程将被放入调度程序的运行队列,并最终被执行(取决于优先级和操作系统处理这些事情的方式)。

事实上,C++标准的第20章和第30章都没有给出这样的保证。