Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程池传递函数作为参数_C++_Multithreading_C++11_Threadpool - Fatal编程技术网

C++ 线程池传递函数作为参数

C++ 线程池传递函数作为参数,c++,multithreading,c++11,threadpool,C++,Multithreading,C++11,Threadpool,我正在尝试实现我自己的并行版本,用作后端线程池 我将任务分成几个部分,并使用以下函数启动一个线程: template <typename Callable> void launchRange(int id, Callable func, int k1, int k2) { for (int k = k1; k < k2; k++) { func(k); } } 但我不断地遇到编译错误。错误是: ...\ithreadpoolitembase.h

我正在尝试实现我自己的并行版本,用作后端线程池

我将任务分成几个部分,并使用以下函数启动一个线程:

template <typename Callable>
void launchRange(int id, Callable func, int k1, int k2)
{
    for (int k = k1; k < k2; k++) {
        func(k);
    }
}
但我不断地遇到编译错误。错误是:

...\ithreadpoolitembase.hpp(36): error C2027: use of undefined type 'std::tuple<conditional<_Test,void(__cdecl *&)(int),_Ty>::type,conditional<_Test,int&,int>::type,conditional<_Test,int&,int>::type>'
with
[
    _Ty=void (__cdecl *)(int)
]

我正在使用Visual Studio 2017 Community 15.4和
/std:c++17
启动范围
是一个函数模板而不是函数

除非重载解析已完成,否则无法将函数模板作为函数传递。该行不会触发重载解析

auto launchRange = [](int id, auto&& func, int k1, int k2)
{
  for (int k = k1; k < k2; k++) {
    func(k);
  }
};
这可能会被编译

我并不特别喜欢那个特定的线程池实现。我的意思是,你可以有多少无意义的pimpl层?多少无意义的堆分配?而且,它默认通过引用传递,这在将内容传递到另一个线程时是一个可怕的想法

我认为在这里进行辩论是一个糟糕的计划。避免使用它们

poolPtr->add([=]{ launchRange(77, func, i1, i2); });

这也消除了创建
自动启动范围=[]
lambda的需要。错误最终更容易阅读。

问题中有一个
c++11
标记,但您使用的是
/std:c++17
?由于您使用的是VS2017,您是否尝试过将函数与一起使用?
c++17
注释是因为ThreadPool library linked声明它需要c++17,所以我希望避免评论说VS2017 15.4不完全支持c++17。谢谢,它在将lambda应用于
add
后工作。关于您的评论,我正在寻找一个轻量级线程池实现。你能推荐一些吗?@Lablabla,比如40行代码?将C++17中的
boost::optional
替换为
std::optional
。它可能需要一些清理,我现在可以写一个更好的,但我相信它是有用的。
auto launchRange = [](int id, auto&& func, int k1, int k2)
{
  for (int k = k1; k < k2; k++) {
    func(k);
  }
};
poolPtr->add(launchRange, 77, func, i1, i2);
poolPtr->add([=]{ launchRange(77, func, i1, i2); });