没有用于初始化' std :: thread'的匹配构造函数

时间:2016-07-04 19:15:03

标签: c++ multithreading c++14

我一直在研究一个相当简单的工具:一个并发的 for 循环结构,它接受一个输入元素列表,一个输出向量和一个计算输出元素的函数。输入元素。

我有这个不编译的代码段:

            template<class In, class Out>
            void thread_do(net::coderodde::concurrent::queue<In>& input_queue,
                           Out (*process)(In in),
                           std::vector<Out>& output_vector)
            {
                // Pop the queue, process, and save result.
                ...
            }


                for (unsigned i = 0; i < thread_count; ++i) 
                {
                    thread_vector.push_back(std::thread(thread_do, 
                                                        input_queue,
                                                        process,
                                                        output_vector));
                }

我使用 -std=c++14


./concurrent.h:129:45: error: no matching constructor for initialization of 'std::thread'
                    thread_vector.push_back(std::thread(thread_do, 
                                            ^           ~~~~~~~~~~

但是,我不知道如何修复它。试图将 & 添加到 thread_do /追加 <In, Out> ,但没有用。

2 个答案:

答案 0 :(得分:6)

这个最小的完整示例(提示)向您展示了如何在另一个线程中调用模板成员函数。

#include <thread>

struct X
{

  template<class A, class B> void run(A a, B b)
  {
  }

  template<class A, class B>
  void run_with(A a, B b)
  {
    mythread = std::thread(&X::run<A, B>, this, a, b);
  }

  std::thread mythread;
};

int main()
{
  X x;
  x.run_with(10, 12);
  x.mythread.join();
}

请注意std::thread的构造函数无法自动推导模板参数。你必须明确。

答案 1 :(得分:1)

您需要实例化您的功能:

{
  "version": "1.0.0-*",

  "dependencies": {
    "NETStandard.Library": "1.6.0",
    "Newtonsoft.Json": "9.0.1",
    "System.ComponentModel.Annotations": "4.1.0",
    "System.ComponentModel.Primitives": "4.1.0",
    "System.Diagnostics.Contracts": "4.0.1",
    "System.Net.Requests": "4.0.11"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": "dnxcore50"
    }
  },

  "buildOptions": {
    "define": [],
    "nowarn": [ "CS3016" ]
  }
}