C++ 随机_设备是否在每个线程的不同状态下启动?

C++ 随机_设备是否在每个线程的不同状态下启动?,c++,random,C++,Random,是否保证随机_设备不会在每个新线程的相同内部状态下启动?那么下面的代码可能会给出两个不同的值 #include <iostream> #include <random> #include <thread> #include <mutex> using namespace std; int main() { auto thr = []() { static mutex mtx; mtx.lock()

是否保证随机_设备不会在每个新线程的相同内部状态下启动?那么下面的代码可能会给出两个不同的值

#include <iostream>
#include <random>
#include <thread>
#include <mutex>

using namespace std;

int main()
{
    auto thr = []()
    {
        static mutex mtx;
        mtx.lock();
        cout << random_device()() << " " << endl;
        mtx.unlock();
    };
    thread t1( thr );
    thread t2( thr );
    t1.join();
    t2.join();
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
自动thr=[]()
{
静态互斥;
mtx.lock();

不能没有这样的保证

在参考资料上我们可以阅读

如果非确定性源(例如硬件设备)不可用于实现,则std::random_设备可根据实现定义的伪随机数引擎来实现。在这种情况下,每个std::random_设备对象可生成相同的数字序列

这基本上取决于实施情况

另一件事是,创建新的
random_设备
s会带来性能成本。最好重复使用相同的设备

auto thr = []()
{
    static mutex mtx;
    static random_device rd{};
    mtx.lock();
    cout << rd() << " " << endl;
    mtx.unlock();
};
auto-thr=[]()
{
静态互斥;
静态随机_装置rd{};
mtx.lock();

不能没有这样的保证

在参考资料上我们可以阅读

如果非确定性源(例如硬件设备)不可用于实现,则std::random_设备可根据实现定义的伪随机数引擎来实现。在这种情况下,每个std::random_设备对象可生成相同的数字序列

这基本上取决于实施情况

另一件事是,创建新的
random_设备
s会带来性能成本。最好重复使用相同的设备

auto thr = []()
{
    static mutex mtx;
    static random_device rd{};
    mtx.lock();
    cout << rd() << " " << endl;
    mtx.unlock();
};
auto-thr=[]()
{
静态互斥;
静态随机_装置rd{};
mtx.lock();


不能,我不认为这是有保证的。但是为什么你需要这个?你可以简单地预先创建多个RNG或重用random_设备。相关的不,绝对与此无关。@appleapple,random_设备线程安全吗?我不相信这一点,因为这会使random_设备的效率大大降低,even如果没有争用,因此没有内核等待。不,我不认为这是有保证的。但是,为什么需要它?您只需事先创建多个RNG或重用random_设备。相关的不,绝对与此无关。@appleapple,random_设备线程安全吗?我不相信这一点,因为这会使e random_设备的效率要低得多,即使没有争用,因此也没有内核等待。我知道,但为了简单起见,我省略了单独的random_设备,在这个例子中它不会有什么坏处。@Bonitamentro我想关键是,如果你重复使用相同的
random_设备
,你一定会得到不同的值(除非实现只返回一个值)。因此,在本例的上下文中,它确实非常重要。跨线程边界重复使用random_设备没有意义。它肯定不是线程安全的。@Bonitamentro不确定您指的是什么。根据实现的不同,它可能是完全线程安全的。在本例中,它也不会跨线程边界使用。通常情况下,您可以只使用它来为PRNG设定种子,这样您就可以以线程安全的方式将RNG或种子传递给线程。由于它是由实现定义的,所以这并不确定。因为
random\u设备
仅用于初始化您的RNG,性能可能不是最重要的。linux机器可能会使用
/dev/uradom
一个Windows机器将使用一些WINAPI调用。我不认为它也不太可能是线程安全的。但是它不是由C++标准保证的。我知道,但是我省略了单独的随机设备,在这个例子中它不起作用。@ BonitaMontero,我想关键是,如果你再使用同一个代码。>random_device
保证获得不同的值(除非实现只返回一个值)。因此,在本例的上下文中,它确实非常重要。跨线程边界重复使用random_设备没有意义。它肯定不是线程安全的。@Bonitamentro不确定您指的是什么。根据实现的不同,它可能是完全线程安全的。在本例中,它也不会跨线程边界使用。通常情况下,您可以只使用它来为PRNG设定种子,这样您就可以以线程安全的方式将RNG或种子传递给线程。由于它是由实现定义的,所以这并不确定。因为
random\u设备
仅用于初始化您的RNG,性能可能不是最重要的。linux机器可能会使用
/dev/uradom
这是线程安全的。Windows机器将使用一些WINAPI调用。我不认为它也不太可能是线程安全的。但是它不能由C++标准保证。