从线程接收结果

时间:2018-12-24 16:21:46

标签: c++ multithreading stdthread

我正在使用以下代码创建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 :(得分: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.建议的那样,最好在每个线程之前创建一个对象,如更新的实时演示所示。

Live demo