C++ 从线程接收结果
我使用以下代码创建10个线程。我希望从我的线程接收不同的随机数并打印它们。但结果是一样的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&
#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::coutrand()
不是线程安全的,请参阅。请改用random
中定义的更现代的函数,例如
std::random_device rd;
auto seed = rd ();
std::mt19937 mt (seed);
....
auto random_number = mt ();
编辑:
正如其他人所指出的,mt19937::operator()
也不能保证线程安全。最好按照n.m.的建议,在每个线程中创建一个这样的对象,正如更新的实时演示现在显示的那样
futureObj[i].get()
将一直阻止,直到您刚刚启动的线程完成。@PeteBeckerstd::mt19937
是一种类型。为什么它不是线程安全的,这意味着什么?@PeteBecker在这种情况下,我想它必须由互斥锁保护(或仅在单个线程上调用)@PaulSanders我很确定每个线程都有一个单独的std::mt19937
对象就足够了。当然,我们需要对每个对象进行不同的种子设定以获得不同的值(默认的随机_设备通常会执行此任务)。@PaulSanders--mutex或单线程也适用于rand()
。正如另一条评论所示,有一个更好的答案。但当人们推荐“更现代的功能”时,我真的很恼火不了解他们能做什么和不能做什么。下意识反应不是正确的设计。@PeteBecker这不是下意识反应。在建议使用这些功能之前,我检查了CPPPreference的比赛条件,没有指定任何功能,但我更喜欢n.m的想法,因为它保证有效,并相应地更新了我的答案。