std::thread 是否对其构造函数 returns 时发生的事情做出任何保证?
Does std::thread make any guarantee about what's happened when its constructor returns?
如果你调用一个非空的std::thread
构造函数,当构造函数returns时线程的状态是否有任何保证(假设线程启动例程有很长的生命周期)?你知道线程是否真的启动了(即它的启动例程已经进入)?
The completion of the invocation of the constructor synchronizes-with (as defined in std::memory_order
) the beginning of the invocation of the copy of f
on the new thread of execution.
因此构造函数将在提供的函数开始之前完成,否则无法保证。
尤其是,您不知道在构造函数结束和构造函数后面的命令开始之间会发生什么。提供的函数可能——也可能不是——似乎在构造函数完成的同时开始。
在频谱的另一端,提供的函数可能会在您的主线程完成后启动(除非有其他考虑,例如 join
ing std::thread
)。
查看 https://en.cppreference.com/w/cpp/thread/thread 中的说明:
Threads begin execution immediately upon construction of the
associated thread object (pending any OS scheduling delays), starting
at the top-level function provided as a constructor argument. :
这告诉您,虽然可以安全地假设新线程将快速开始执行,也就是说,很可能在微秒内,但您不知道操作系统的延迟是多少。如果你在 single-core single-thread 机器上,你的所有线程和操作系统将共享相同的硬件资源,并且所有线程都将在它们的时间 windows 中依次执行。你不应该假设谁会第一个 window 以及它会持续多长时间。
换句话说,您可以安全地假设创建一个 std::thread
对象只不过是通知操作系统您恳请它以给定函数作为起点创建一个新线程,但是您不知道 OS 什么时候会这样做。
所以答案是:不,您不能假设另一个线程是否已经 运行。有时是,有时不是。
如果你调用一个非空的std::thread
构造函数,当构造函数returns时线程的状态是否有任何保证(假设线程启动例程有很长的生命周期)?你知道线程是否真的启动了(即它的启动例程已经进入)?
The completion of the invocation of the constructor synchronizes-with (as defined in
std::memory_order
) the beginning of the invocation of the copy off
on the new thread of execution.
因此构造函数将在提供的函数开始之前完成,否则无法保证。
尤其是,您不知道在构造函数结束和构造函数后面的命令开始之间会发生什么。提供的函数可能——也可能不是——似乎在构造函数完成的同时开始。
在频谱的另一端,提供的函数可能会在您的主线程完成后启动(除非有其他考虑,例如 join
ing std::thread
)。
查看 https://en.cppreference.com/w/cpp/thread/thread 中的说明:
Threads begin execution immediately upon construction of the associated thread object (pending any OS scheduling delays), starting at the top-level function provided as a constructor argument. :
这告诉您,虽然可以安全地假设新线程将快速开始执行,也就是说,很可能在微秒内,但您不知道操作系统的延迟是多少。如果你在 single-core single-thread 机器上,你的所有线程和操作系统将共享相同的硬件资源,并且所有线程都将在它们的时间 windows 中依次执行。你不应该假设谁会第一个 window 以及它会持续多长时间。
换句话说,您可以安全地假设创建一个 std::thread
对象只不过是通知操作系统您恳请它以给定函数作为起点创建一个新线程,但是您不知道 OS 什么时候会这样做。
所以答案是:不,您不能假设另一个线程是否已经 运行。有时是,有时不是。