Получение результатов из потока - PullRequest
0 голосов
/ 24 декабря 2018

Я использую следующий код для создания 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 Ответ

0 голосов
/ 24 декабря 2018

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

Живое демо

...