c++ - 使用 C++11 随机库在多线程中生成随机数是否像在多线程中使用 rand() 一样慢?

标签 c++ multithreading c++11 random

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

最佳答案

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

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

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

关于c++ - 使用 C++11 随机库在多线程中生成随机数是否像在多线程中使用 rand() 一样慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24007263/

相关文章:

c++ - Qt 在游戏循环中短时间停止关键事件

c++ - 如何让列表可以隐式转换为我的类对象?

Java线程join()混淆

python - 在 python 中处理不断变化的列表的正确方法

c++ - 使用已删除的复制构造函数和初始化列表重载调用类定义中的成员构造函数

c++ - c++ - 如何在不实际创建临时对象的情况下传递子字符串

c++ - 在 C++ : Why is a blank line entering getline after piping? 中编码管道 "|"

c# - 从另一个线程更新 ObservableCollection 的最佳方法是什么?

c++ - C++ 中是否有任何跨平台线程库?

c++ - 基于范围的for循环可以在一个范围内工作吗