首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

random_shuffle线程是否安全?如果不是,则使用rand_r

根据您的问答内容,我将回答以下问题:

问题: random_shuffle线程是否安全?如果不是,则使用rand_r。

答案:

random_shuffle线程安全性取决于实现方式。在C++11之前,std::random_shuffle 是线程不安全的,因为它使用全局随机数生成器。但是,在C++11中,std::random_shuffle 被标记为弃用,并被 std::shuffle 替代。std::shuffle 是线程不安全的,因为它使用随机数生成器作为参数,而不是全局随机数生成器。

如果您需要在多线程环境中使用线程安全的随机数生成器,可以使用以下方法:

  1. 使用线程局部随机数生成器(Thread-local Random Number Generator):这是一种在每个线程中创建独立随机数生成器的方法。这样,每个线程都有自己的随机数生成器,不会产生竞争条件。
代码语言:cpp
复制
#include<random>

std::random_device rd;
std::mt19937 gen(rd());

thread_local std::mt19937 tl_gen(rd());

void thread_safe_random_shuffle(std::vector<int>& v) {
    std::shuffle(v.begin(), v.end(), tl_gen);
}
  1. 使用互斥锁(Mutex):通过在访问随机数生成器时使用互斥锁,可以确保同一时间只有一个线程可以访问随机数生成器。
代码语言:cpp
复制
#include<random>
#include <mutex>

std::random_device rd;
std::mt19937 gen(rd());
std::mutex mtx;

void thread_safe_random_shuffle(std::vector<int>& v) {
    std::lock_guard<std::mutex> lock(mtx);
    std::shuffle(v.begin(), v.end(), gen);
}

请注意,这些方法仅适用于C++11及更高版本。如果您使用的是早期版本的C++,可以考虑使用其他线程安全的随机数生成器库,例如Boost.Random。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券