std::线程构造和执行
std::thread construction and execution
如果可以保证线程在线程对象构造完成后实际运行,我在文档中找不到任何信息。换句话说,是否可以保证线程构造函数完成后线程函数已经在执行?如有参考,不胜感激。
否,不能保证在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章都没有给出这样的保证。
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 如何创建线程序列以按照启动顺序执行任务?
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 如何制作一个只能在一个线程上同时执行的函数?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 工作线程在执行太快后永久休眠
- 超时后,线程睡眠不会继续执行
- 如何将带有参数的方法传递给线程以执行?
- 将执行循环拆分为多个线程 (1-N-1-N-1..)
- Visual Studio 发布模式阻止在调试模式下执行的代码.使用 WinHTTP 和多线程
- MFC执行线程问题
- Qt不能多次执行线程
- future::wait() 是否与 async() 执行线程的完成同步?
- std::线程何时执行线程
- 使用for循环执行线程
- 松弛的内存顺序效果是否可以扩展到执行线程的生命周期之后?
- 在C++11中,"不代表执行线程"的线程有什么意义?
- C++ 线程执行时间和另一个线程中的执行线程