根据您的问答内容,我将回答以下问题:
问题: random_shuffle线程是否安全?如果不是,则使用rand_r。
答案:
random_shuffle线程安全性取决于实现方式。在C++11之前,std::random_shuffle
是线程不安全的,因为它使用全局随机数生成器。但是,在C++11中,std::random_shuffle
被标记为弃用,并被 std::shuffle
替代。std::shuffle
是线程不安全的,因为它使用随机数生成器作为参数,而不是全局随机数生成器。
如果您需要在多线程环境中使用线程安全的随机数生成器,可以使用以下方法:
#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);
}
#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。
领取专属 10元无门槛券
手把手带您无忧上云