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

Far*_*zad 1 c++ random multithreading c++11

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

Jer*_*fin 7

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

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

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

  • @quantdev:如果你想在线程之间共享一个生成器,你必须做锁定才能保证安全.我所倡导的是在每个线程中使用一个单独的生成器,来自`std :: random_device`的数字作为种子提供给每个. (2认同)