C++ 从线程接收结果

C++ 从线程接收结果,c++,multithreading,stdthread,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&

我使用以下代码创建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;
}
#包括“pch.h”
#包括
#包括“C.h”
#包括“BB.h”
#包括
#包括
#包括
#包括
void initiazer(std::promise*promObj,int i)
{
std::cout
rand()
不是线程安全的,请参阅。请改用
random
中定义的更现代的函数,例如

std::random_device rd;
auto seed = rd ();
std::mt19937 mt (seed);
....
auto random_number = mt ();
编辑:

正如其他人所指出的,
mt19937::operator()
也不能保证线程安全。最好按照n.m.的建议,在每个线程中创建一个这样的对象,正如更新的实时演示现在显示的那样


futureObj[i].get()
将一直阻止,直到您刚刚启动的线程完成。@PeteBecker
std::mt19937
是一种类型。为什么它不是线程安全的,这意味着什么?@PeteBecker在这种情况下,我想它必须由互斥锁保护(或仅在单个线程上调用)@PaulSanders我很确定每个线程都有一个单独的
std::mt19937
对象就足够了。当然,我们需要对每个对象进行不同的种子设定以获得不同的值(默认的随机_设备通常会执行此任务)。@PaulSanders--mutex或单线程也适用于
rand()
。正如另一条评论所示,有一个更好的答案。但当人们推荐“更现代的功能”时,我真的很恼火不了解他们能做什么和不能做什么。下意识反应不是正确的设计。@PeteBecker这不是下意识反应。在建议使用这些功能之前,我检查了CPPPreference的比赛条件,没有指定任何功能,但我更喜欢n.m的想法,因为它保证有效,并相应地更新了我的答案。