std :: random_shuffle线程安全吗?

时间:2013-07-18 10:12:54

标签: c++ c++11 random thread-safety shuffle

在C ++ 11中,算法std::random_shuffle线程安全(当由两个不同容器上的两个不同线程调用时)?

特别是这种形式:

template <class RandomIt> void random_shuffle(RandomIt first, RandomIt last);

2 个答案:

答案 0 :(得分:5)

如果该函数的两个并发执行对同一数据“不起作用”,则函数是线程安全的。这里的“工作”意味着没有任何函数可以以非原子,非一致的方式修改数据。函数可以通过三种方式访问​​数据:

  1. 通过函数参数,包括那些参数引用的对象
  2. 通过对象
  3. 调用成员函数
  4. 函数static,class static和global data,包括间接调用的函数使用的数据。
  5. 由于random_shuffle是免费功能,2.不适用。然而,该函数具有参数,并且在它改变基础序列的内容的意义上它起作用。但是如果并发调用不对重叠序列进行操作,则没有问题。

    留下静态/全局数据。大多数randum号码生成器将使用某种全球数据作为种子。默认随机函数rand不需要是线程安全的,并且可能不会显式同步对其全局种子的访问。

    所以在你的情况下不,它不是线程安全(除非是随机数生成器)。

    您将要编写随机数生成器的同步版本,并在并发调用中使用不同的生成器。我更喜欢使用后者,因此并发shuffle不会干扰彼此的随机数序列。 (但我绝不是随机数生成方面的专家)。

答案 1 :(得分:3)

如果它使用线程安全的随机数生成器,则它是线程安全的。生成器是实现定义的(并且,如果它使用std::rand,它的实现定义是否安全),因此您需要查阅您正在使用的实现的文档。

可以肯定的是,您应该使用其他变体之一,为每个线程提供线程安全的生成器或单独的生成器。