问题描述
如果调用非空std::thread
构造函数之一,构造函数返回时是否可以保证线程状态(假定线程启动例程的寿命很长)?您知道该线程实际上是否已启动(即已输入其启动例程)吗?
解决方法
构造函数 synchronizes-with (如
std::memory_order
定义)的调用完成,在新线程上调用f
的副本的开始。执行。
因此,构造函数将在提供的函数启动之前完成,但否则无法保证。
尤其是,您不知道在构造函数的末尾与构造函数之后的命令开始之间会发生什么。所提供的功能可能(也可能不是)似乎在构造函数完成的同时启动。
在另一端,提供的功能可能会在您的主线程完成后启动(除非有其他考虑,例如join
和std::thread
)。
查看https://en.cppreference.com/w/cpp/thread/thread上的描述:
线程在构造后立即开始执行 关联的线程对象(等待任何操作系统调度延迟),开始 作为构造函数参数提供的顶级功能。 :
这告诉您可以安全地假设新线程将快速开始执行,即很可能在几微秒内开始执行,但是您不知道操作系统延迟将是多少。如果您在单核单线程计算机上,则所有线程和操作系统将共享相同的硬件资源,并且所有线程将在其时间窗口内依次执行。您不应该假设谁将使用第一个窗口以及它将持续多长时间。
换句话说,您可以放心地假设创建std::thread
对象只不过是通知操作系统,请您请它创建一个以给定功能为起点的新线程,但是您不必这样做。知道什么时候操作系统会好心地这样做。
所以答案是:不,您不能假设另一个线程是否已经在运行。有时是,有时不是。