在C ++ 11中,算法std::random_shuffle线程安全(当由两个不同容器上的两个不同线程调用时)?
特别是这种形式:
template <class RandomIt> void random_shuffle(RandomIt first, RandomIt last);
答案 0 :(得分:5)
如果该函数的两个并发执行对同一数据“不起作用”,则函数是线程安全的。这里的“工作”意味着没有任何函数可以以非原子,非一致的方式修改数据。函数可以通过三种方式访问数据:
由于random_shuffle
是免费功能,2.
不适用。然而,该函数具有参数,并且在它改变基础序列的内容的意义上它起作用。但是如果并发调用不对重叠序列进行操作,则没有问题。
留下静态/全局数据。大多数randum号码生成器将使用某种全球数据作为种子。默认随机函数rand
不需要是线程安全的,并且可能不会显式同步对其全局种子的访问。
所以在你的情况下不,它不是线程安全(除非是随机数生成器)。
您将要编写随机数生成器的同步版本,并在并发调用中使用不同的生成器。我更喜欢使用后者,因此并发shuffle不会干扰彼此的随机数序列。 (但我绝不是随机数生成方面的专家)。
答案 1 :(得分:3)
如果它使用线程安全的随机数生成器,则它是线程安全的。生成器是实现定义的(并且,如果它使用std::rand
,它的实现定义是否安全),因此您需要查阅您正在使用的实现的文档。
可以肯定的是,您应该使用其他变体之一,为每个线程提供线程安全的生成器或单独的生成器。