标准线程构造函数是否采用可变线程函数?
Does std thread constructor take variadic thread function?
我正在尝试将可变计数的回调函数(所有具有相同的签名)传递给线程函数。我想出了以下代码
using namespace std;
void callback(int i)
{
cout<<"thread "<<i<<" running"<<endl;
}
template<typename ...CallbackType>
void threadProc(int id, CallbackType ...callbackPack)
{
auto callbacks = {callbackPack...};
for(auto callback : callbacks)
{
callback(id);
}
}
int main()
{
thread t(threadProc<void(int)>, 1, callback);
t.join();
return 0;
}
此代码无法通过
编译
error: no matching function for call to ‘std::thread::thread(, int, void (&)(int))’
thread t(threadProc<void(int)>, 1, callback);
如果 threadProc()
不使用任何参数包,一切都会正常进行。是否有使用可变线程函数启动线程的正确方法?
你的第一个参数是一个函数指针,因此使用
thread t{threadProc<void(*)(int)>, 1, callback};
您的代码没有任何问题。这似乎只是 GCC 中的一个错误,与线程无关。重现错误的最小测试用例是:
template <typename... T>
void foo(T...) {}
int main()
{
auto* pfoo = foo<void(int)>;
return 0;
}
GCC 似乎不喜欢 foo
有一个 void(int)
类型的参数。然而语言的规则很明确:这是允许的,函数类型作为参数类型出现时调整为对应的函数指针类型。
其他编译器似乎没有问题。参见 https://godbolt.org/z/tgaV7B
作为解决方法,您可以编写:
thread t(threadProc<void(*)(int)>, 1, callback);
或:
thread t(threadProc<decltype(&callback)>, 1, callback);
我正在尝试将可变计数的回调函数(所有具有相同的签名)传递给线程函数。我想出了以下代码
using namespace std;
void callback(int i)
{
cout<<"thread "<<i<<" running"<<endl;
}
template<typename ...CallbackType>
void threadProc(int id, CallbackType ...callbackPack)
{
auto callbacks = {callbackPack...};
for(auto callback : callbacks)
{
callback(id);
}
}
int main()
{
thread t(threadProc<void(int)>, 1, callback);
t.join();
return 0;
}
此代码无法通过
编译error: no matching function for call to ‘std::thread::thread(, int, void (&)(int))’
thread t(threadProc<void(int)>, 1, callback);
如果 threadProc()
不使用任何参数包,一切都会正常进行。是否有使用可变线程函数启动线程的正确方法?
你的第一个参数是一个函数指针,因此使用
thread t{threadProc<void(*)(int)>, 1, callback};
您的代码没有任何问题。这似乎只是 GCC 中的一个错误,与线程无关。重现错误的最小测试用例是:
template <typename... T>
void foo(T...) {}
int main()
{
auto* pfoo = foo<void(int)>;
return 0;
}
GCC 似乎不喜欢 foo
有一个 void(int)
类型的参数。然而语言的规则很明确:这是允许的,函数类型作为参数类型出现时调整为对应的函数指针类型。
其他编译器似乎没有问题。参见 https://godbolt.org/z/tgaV7B
作为解决方法,您可以编写:
thread t(threadProc<void(*)(int)>, 1, callback);
或:
thread t(threadProc<decltype(&callback)>, 1, callback);