Получение результатов из потока

Я использую следующий код для создания 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, создать один из этих объектов для каждого потока, как теперь показывает обновленное живое демо.

Живая демо

Другие вопросы по тегам