如果在线程对象构造完成后保证线程实际正在运行,我在documentation中找不到任何信息。换句话说,是否保证在线程构造函数完成后线程函数已经被执行?一些参考文献将不胜感激。
答案 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 ++标准给出了这样的保证。