我一直在研究一个相当简单的工具:一个并发的 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>
,但没有用。
答案 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" ]
}
}