多线程中,如何使用std::mt19937_64
时间: 2024-04-11 19:27:51 浏览: 268
多线程使用
在多线程环境中使用 `std::mt19937_64` 需要注意线程安全性,因为 `std::mt19937_64` 内部保留了一些状态信息。以下是一种常见的多线程使用 `std::mt19937_64` 的方法:
1. 在每个线程中创建独立的 `std::mt19937_64` 对象,确保每个线程都有自己的随机数生成器。
2. 每个线程都需要独立的种子来初始化随机数生成器。可以使用不同的种子,例如线程 ID、时间戳等。
3. 在每个线程中使用 `std::mt19937_64` 生成随机数。
以下是一个示例代码:
```c++
#include <iostream>
#include <random>
#include <thread>
void generateRandomNumber(int threadId) {
// 使用线程 ID 初始化随机数生成器
std::mt19937_64 rng(std::hash<std::thread::id>{}(std::this_thread::get_id()));
// 生成随机数
std::uniform_int_distribution<int> dist(1, 10);
int random_number = dist(rng);
// 打印结果
std::cout << "线程 " << threadId << " 生成的随机数为:" << random_number << std::endl;
}
int main() {
// 创建多个线程
std::thread t1(generateRandomNumber, 1);
std::thread t2(generateRandomNumber, 2);
// 等待线程结束
t1.join();
t2.join();
return 0;
}
```
在上述示例中,我们在 `generateRandomNumber` 函数中,使用线程 ID 初始化了每个线程的随机数生成器 `std::mt19937_64 rng`。然后,使用 `std::uniform_int_distribution` 定义了一个范围为1-10的均匀分布,并使用 `rng` 生成随机数。每个线程都会生成一个随机数,并打印结果。
需要注意的是,由于 `std::mt19937_64` 内部包含了状态信息,所以每个线程需要有自己独立的对象,并使用不同的种子来初始化。这样可以避免多个线程之间的竞争条件,确保线程安全性。
阅读全文