我正在使用以下代码创建10个线程。我希望从线程中收到不同的随机数并进行打印。但是结果是一样的。
#include "pch.h"
#include <iostream>
#include "C.h"
#include "BB.h"
#include <vector>
#include <thread>
#include <mutex>
#include <future>
void initiazer(std::promise<int> * promObj, int i)
{
std::cout << "Inside Thread " <<i<< std::endl;
(promObj)->set_value((rand() % 100) + 1);
}
int main()
{
srand((unsigned)time(0));
std::promise<int> promiseObj[10];
std::future<int> futureObj [10];
std::thread th[10];
for (size_t i = 0; i < 10; i++)
{
futureObj[i] = promiseObj[i].get_future();
}
for (size_t i = 0; i < 10; i++)
{
th[i] = std::thread(initiazer,&promiseObj[i],i) ;
std::cout << futureObj[i].get() << std::endl;
}
for (size_t i = 0; i < 10; i++)
{
th[i].join();
}
return 0;
}
答案 0 :(得分:2)
rand()
不是线程安全的,请参见https://linux.die.net/man/3/rand。改用random
中定义的更现代的功能,例如
std::random_device rd;
auto seed = rd ();
std::mt19937 mt (seed);
....
auto random_number = mt ();
编辑:
正如其他人指出的那样,mt19937::operator ()
也不保证是线程安全的。如n.m.建议的那样,最好在每个线程之前创建一个对象,如更新的实时演示所示。