std::random_shuffle线程安全吗
Is std::random_shuffle thread safe?
在C++11中,算法std::random_shuffle线程安全吗(当由两个不同容器上的两个不同线程调用时)?
尤其是这种形式:
template <class RandomIt> void random_shuffle(RandomIt first, RandomIt last);
如果一个函数的两个并发执行不在同一数据上"工作",则该函数是线程安全的。这里的"工作"意味着没有一个函数可以以非原子、非一致的方式修改数据。有三种方式可以通过功能访问数据:
- 通过函数参数,包括这些参数所引用的对象
- 通过对象调用成员函数
- 函数静态、类静态和全局数据,包括被间接调用的函数所使用的数据
由于random_shuffle
是一个自由函数,因此2.
不适用。然而,函数有参数,它在改变底层序列内容的意义上处理这些参数。但是,如果并发调用不在重叠序列上操作,就不会有问题。
这就留下了静态/全局数据。大多数随机数生成器将使用某种全局数据作为种子。默认的随机函数rand
不需要是线程安全的,并且可能不会显式同步对其全局种子的访问。
因此,在您的情况下不,它不是线程安全的(除非随机数生成器是)。
您可能想要编写一个同步版本的随机数生成器,或者在并发调用中使用不同的生成器。我更喜欢使用后者,这样并发的洗牌就不会干扰彼此的随机数序列。(但我绝不是随机数生成方面的专家)。
如果它使用线程安全的随机数生成器,那么它是线程安全的。生成器是由实现定义的(如果它使用std::rand
,则由实现定义是否安全),因此您需要查阅正在使用的实现的文档。
可以肯定的是,您应该使用其他变体之一,为每个线程提供线程安全生成器或单独的生成器。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具