我尝试使用rand()
函数在多线程C ++程序的每个线程中创建随机数。当我增加线程数时,我最终得到了更糟糕的结果。感谢this post,我发现由于需要跟踪状态,rand()
会为每次通话使用锁定。
使用C ++ 11随机库(this usage作为示例)是否执行相同的过程,如果我使用它,我应该期待相同的观察?或者C ++ 11可以提供一种解决方法吗?
答案 0 :(得分:7)
是和否。大多数C ++ 11随机数生成器都是封装自己状态的对象,因此只要为每个线程创建一个单独的生成器对象,每个都应该能够独立于其他生成器运行(因此您不需要任何生成器)锁定)。
std::random_device
的具体情况虽然有点不同:这是为了(但不能保证)从某种随机数生成硬件中获取真正的非确定性数据。该设备的驱动程序可能会强加其自身的锁定要求 - 而且通常也是相当低的带宽,因此如果您想快速获得大量数字,通常是一个糟糕的选择。
在典型情况下,您希望每个线程使用一个生成器(std::random_device
除外),并仅使用std::random_device
为其他生成器提供初始种子。这可能会在初始化期间强制执行锁定,但随后允许每个线程生成其随机数,而不与其他线程互锁。