2013-07-15 33 views
1

如果在线程对象构造完成后没有保证线程实际运行,我在documentation中找不到任何信息。换句话说,在线程构造函数完成之后,是否保证线程函数已被执行?一些参考将不胜感激。std ::线程构建和执行

回答

9

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

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进行评估。此调用的任何返回值都会被忽略。

4

是有保证的线程功能已经被线程构造后执行完毕

C++标准不能要求这一点。

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

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

1

“running”是什么意思?保证 参数将被复制,并且至少在大多数系统上,复制必须发生在新创建的线程中。但那 没有多大意义。对此,什么是重要的? 在你从构造函数返回之前,新创建的线程执行单机 指令?它 已经执行完整的C++语句?或者是什么?

1

不能有在C++标准如此出示担保,作为创建的线程将被放到调度的运行队列,并最终被执行(取决于优先级和操作系统正在处理这些事情的方式) 。

事实上, 20也不是章。 C++标准中有30项提供了这样的保证。