【问题标题】:Is random number generation in multiple threads using C++11 random library slow just like using rand() in multiple threads?使用 C++11 随机库在多线程中生成随机数是否像在多线程中使用 rand() 一样慢?
【发布时间】:2014-06-03 04:42:23
【问题描述】:

我尝试使用rand() 函数在多线程 C++ 程序的每个线程中创建随机数。随着线程数量的增加,我最终得到了更糟糕的结果。感谢this post,我发现因为它需要跟踪状态,rand() 对每个调用都使用了一个锁。
使用 C++11 随机库(以this usage 为例)是否执行相同的过程,如果我使用它,我应该期待相同的观察结果吗?还是 C++11 可以提供一种解决方法?

【问题讨论】:

    标签: c++ multithreading c++11 random


    【解决方案1】:

    是的,不是的。大多数 C++11 随机数生成器都是封装了自己状态的对象,因此只要为每个线程创建一个单独的生成器对象,每个都应该能够独立于其他运行(因此您不需要任何锁定)。

    std::random_device 的具体情况略有不同:这是为了(但不保证)从某种随机数生成硬件中获取真正的非确定性数据。该设备的驱动程序很可能会施加自己的锁定要求——而且它的带宽通常也相当低,所以如果你想快速获得大量数字,它通常是一个糟糕的选择。

    在典型情况下,您希望每个线程使用一个生成器(std::random_device 除外),并仅使用 std::random_device 为其他生成器提供初始种子。这可能会在初始化期间施加锁,但随后允许每个线程生成其随机数,而不会与其他线程发生任何互锁。

    【讨论】:

    • 我虽然没有指定 C11 rand 生成器的线程安全性(即它依赖于实现)。是吗 ? stackoverflow.com/questions/8813592/…
    • @quantdev:如果你想在线程之间共享一个生成器,你必须进行锁定以确保安全。我提倡的是在每个线程中使用一个单独的生成器,将来自std::random_device 的数字作为种子提供给每个线程。
    猜你喜欢
    • 2013-11-09
    • 2013-03-15
    • 2016-05-13
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多