Получение результатов из потока
Я использую следующий код для создания 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;
}
1 ответ
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 ()
также не гарантируется поточность. Тогда лучше, как предполагает nm, создать один из этих объектов для каждого потока, как теперь показывает обновленное живое демо.