使用C ++ 11随机库在多个线程中生成随机数就像在多个线程中使用rand()一样慢吗?

时间:2014-06-03 04:42:23

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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