2

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

4

5 回答 5

11

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

于 2013-07-15T13:55:08.273 回答
4

线程构造函数完成后是否保证线程函数已经在执行

C++ 标准不能要求这个。

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

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

于 2013-07-15T13:55:02.910 回答
2

从 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此调用的任何返回值都将被忽略。

于 2013-07-15T13:54:59.223 回答
1

“跑”是什么意思?可以保证参数将被复制,并且至少在大多数系统上,复制必须发生在新创建的线程中。但这并不意味着什么。就此而言,什么是重要的?新创建的线程在从构造函数返回之前执行一条机器指令?它已经执行了一个完整的 C++ 语句?或者是什么?

于 2013-07-15T14:00:23.900 回答
1

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

事实上,两者都没有。20 也不是第 20 章。C++ 标准的 30 条给出了这样的保证。

于 2013-07-15T14:03:00.283 回答