记一下那些伪随机数生成函数
这篇讲的是一个在多线程环境下由伪随机数生成函数引发的性能“血案”。作者在使用100M数据跑LDA算法时,发现多线程迭代反而比单线程慢了数倍,且CPU大量时间耗在系统空间。排查后发现,罪魁祸首正是代码中调用的random()函数。 原来,glibc中的random()和rand()虽然是线程安全的,但其内部实现(加了一把全局锁)导致它们是不可重入的。在多线程竞争同一把锁时,性能便一落千丈。文章进而对比了rand_r()等可重入函数的实现,指出其算法较弱;而drand48系列函数则提供了更优的、基于独立状态数组的可重入版本(如erand48_r())。作者清晰地梳理了这些函数族的内在区别与适用场景:若需多线程高性能计算,必须使用能维护线程本地状态的可重入版本。 文章从具体坑点出发,剖析了glibc源码实现,最终落到了对随机数函数选型的实用建议上,对理解并发编程中的隐形陷阱很有启发。