每当我尝试编译这个程序时,我都会收到错误:“错误C2661:'std :: thread :: thread':没有重载函数需要7个参数”。当我尝试使用
创建线程时,我得到了这个genparts<T>
或只是
genparts.
我正在努力让自己熟悉线程,以及它的价值。
我知道我不应该传递一个传入如此多参数的函数,并且传递一个包含这些信息的结构会更好 - 这是我一旦得到所有东西就会解决的问题并且正在运行。
template <typename T>
void genparts(unsigned int target, unsigned int &total, unsigned int low, unsigned int high, map<unsigned int, unsigned int> container, T gen){
return;}
还有一个调用函数:
void genpart(unsigned int target, map<unsigned int, unsigned int> &container, T& gen){
unsigned int total[2];
map<unsigned int, unsigned int> results[2];
do{
total[0]=0;
total[1]=0;
thread t1(genparts<T>, target, total[0], 1, target/2, results[0], gen);
thread t2(genparts<T>, target, total[1], 1+(target/2), target, results[1], gen);
t1.join();
t2.join();
}while(total[0]+total[1] != target);
}
非常感谢你的帮助!谢谢!
答案 0 :(得分:2)
很多细节都是错误的......就像你传递的参数数量一样(容器去了哪里?),而且你一直在复制地图。但最重要的是,需要通过引用线程函数传递的参数需要包含在std::ref
中。总而言之,这是一个“有效”的版本:
#include <map>
#include <thread>
template <typename T>
void genparts(unsigned int target, unsigned int &total,
unsigned int low, unsigned int high,
std::map<unsigned int, unsigned int>& container, T& gen)
{ /* ... */ }
template <typename T>
void genpart(unsigned int target,
std::map<unsigned int, unsigned int> &container, T& gen)
{
unsigned int total[2];
std::map<unsigned int, unsigned int> results[2];
do
{
total[0] = 0;
total[1] = 0;
std::thread t1(genparts<T>, target, std::ref(total[0]), 1,
target / 2, std::ref(container), std::ref(gen));
std::thread t2(genparts<T>, target, std::ref(total[1]), 1 + (target / 2),
target, std::ref(container), std::ref(gen));
t1.join();
t2.join();
} while (total[0] + total[1] != target);
}