std :: thread构造和执行

时间:2013-07-15 13:50:09

标签: c++ multithreading c++11 constructor

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

5 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

  

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

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

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

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

答案 2 :(得分: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的调用进行评估。此调用的任何返回值都将被忽略。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

实际上两个人都没有。 20也不是。 30个C ++标准给出了这样的保证。