gpt4 book ai didi

multithreading - C++ 11线程的编译错误

转载 作者:行者123 更新时间:2023-12-03 12:52:24 26 4
gpt4 key购买 nike

我试图理解为什么我的代码给出了编译错误。我做了一个最小的示例,该示例与我的项目中的代码保持相同的行为/体系结构和错误。目标是对向量中的对象进行并行评估。

template < class InputIterator, class OutputIterator >
void evaluate( InputIterator first, InputIterator last, OutputIterator outfirst ) {
while( first != last ) {
*outfirst++ = (*first++) / 2 ; // only for the example
}
}

template < int num_t = 4 >
struct ParallelEvaluator {

template< typename InputContainer , typename OutputContainer >
static void eval(InputContainer const & src, OutputContainer & dst) {
std::vector<std::thread> threads ;
auto bg = src.begin() ;
auto bg_r = dst.begin() ;
for ( int i = 0 ; i < num_t ; i++ ) {
threads.push_back(std::thread(evaluate<typename InputContainer::iterator,typename OutputContainer::iterator>
,bg,bg+4,bg_r)) ;
bg = bg+4 ;
bg_r = bg_r + 4 ;
}
std::for_each(threads.begin(),threads.end(),std::mem_fn(&std::thread::join));
}
};


int main()
{
std::vector<int> t = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} ;
std::vector<int> v(16) ;

ParallelEvaluator<4>::eval(t,v) ;

return 0;
}

当我尝试编译此代码时,出现以下错误:
/usr/include/c++/4.8/functional:1697: error: no type named 'type' in 'class std::result_of<void (*(__gnu_cxx::__normal_iterator<const int*, std::vector<int> >, __gnu_cxx::__normal_iterator<const int*, std::vector<int> >, __gnu_cxx::__normal_iterator<int*, std::vector<int> >))(__gnu_cxx::__normal_iterator<int*, std::vector<int> >, __gnu_cxx::__normal_iterator<int*, std::vector<int> >, __gnu_cxx::__normal_iterator<int*, std::vector<int> >)>'

我看到在线程回调中使用引用时会发生这种错误,但实际情况并非如此。

有人知道为什么会发生此错误吗?我需要使用模板和co的特定语法吗?

谢谢

最佳答案

bg的类型不是std::vector<int>::iterator,而是std::vector<int>::const_iterator,因为srcconst&。懒惰,让编译器使用decltype推断出正确的类型。 (另外,您可以通过使用std::array<std::thread,num_t>而不是std::vector<std::thread>来避免一些内存分配。):

template< typename InputContainer , typename OutputContainer >
static void eval(InputContainer const & src, OutputContainer & dst) {
std::array<std::thread, num_t> threads ;
auto bg = src.begin() ;
auto bg_r = dst.begin() ;
for ( int i = 0 ; i < num_t ; i++ ) {
threads[i] = std::thread(evaluate<decltype(bg),decltype(bg_r)>
,bg,bg+4,bg_r)) ;
bg = bg+4 ;
bg_r = bg_r + 4 ;
}
std::for_each(threads.begin(),threads.end(),std::mem_fn(&std::thread::join));
}

如果您发现lambdas令人反感,则 threads[i] = std::thread([=]{ evaluate(bg,bg+4,bg_r); });会以较少的语法执行相同的操作。

关于multithreading - C++ 11线程的编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24454717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com