繁体   English   中英

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

[英]Is random number generation in multiple threads using C++11 random library slow just like using rand() in multiple threads?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM