我在将可调用对象(函数指针)转发到 线。 这是尝试实现的示例代码。
#include <iostream>
#include <thread>
using namespace std;
void my_func(int x, int y, int z){
cout << "X: " << x << "\tY: " << y << "\tZ "<<z << endl;
}
template <typename T, typename ... Args>
void my_thread(T func, Args&&... args){
// Do something
func(forward<Args&&>(args)...);
}
template <typename T, typename ... Args>
void call_thread(T func, Args&& ... args){
// Do something
thread t1(my_thread, func, forward<Args&&>(args)...);
t1.detach();
}
int main()
{
call_thread(my_func, 2,5,6);
return 0;
}
错误:
In instantiation of 'void call_thread(T, Args&& ...) [with T = void (*)(int, int, int); Args = {int, int, int}]':
required from here
error: no matching function for call to 'std::thread::thread(<unresolved overloaded function type>, void (*&)(int, int, int), int, int, int)'
thread t1(my_thread, func, forward<Args&&>(args)...);
^
答案 0 :(得分:0)
在声明中
thread t1(my_thread, func, forward<Args&&>(args)...);
由于my_thread
是函数模板的名称,因此它实质上是一大堆不同的函数。但是,要实例化std::thread
构造函数并创建std::thread
,编译器只需选择my_thread
和std::thread
构造函数的一种特殊化。由于thread
构造函数被设置为完全接受任何可调用类型作为第一个参数,因此在可调用和参数之间没有直接的关系可以将其强制为一种类型,并且编译器可以不能自行解决。
因此请指定正确的my_thread
专业化名称:
thread t1(my_thread<T, Args...>, func, forward<Args&&>(args)...);
答案 1 :(得分:0)
恕我直言,在一个立即超出范围的函数中初始化std :: thread并不是一个好主意。最好跟踪std :: thread对象。无论如何,您的my_thread()函数对我来说似乎是不必要的,因为call_thread()会调用传递给它的线程函数(func)。在Arch Linux x86_64上使用-lpthread
编译时,以下代码有效:
#include <iostream>
#include <thread>
#include <utility>
using namespace std::chrono_literals;
void my_func(int x, int y, int z){
std::cout << "X: " << x << "\tY: " << y << "\tZ "<<z << std::endl;
}
template <typename T, typename ... Args>
void call_thread(T&& func, Args&& ... args) {
// Do something
std::thread t1(std::forward<T>(func), std::forward<Args>(args)...);
t1.detach();
}
int main() {
call_thread(my_func, 2, 5, 6);
std::this_thread::sleep_for(5s);
return 0;
}
顺便说一句,您需要线程在最后进入睡眠状态;否则,在my_func()打印出值之前,您的程序将到达return 0
并退出!