我正在尝试执行以下操作来启动线程执行:
#include <thread>
#include <stdio.h>
typedef void (*callback_function)(void);
void printer(){
printf("Something\n");
}
void doTask(callback_function a){
std::thread t1(a);
}
int main(){
callback_function print = printer;
doTask(print);
}
执行这段代码,结果就是内核被转储了。令人惊讶的是,当我将函数doTask更改为此:
void doTask(callback_function a){
a();
}
它起作用,或者甚至也起作用:
int main(){
callback_function print = printer;
std::thread t1(printer);
}
有人知道我在想什么或做错了什么吗?
最佳答案
两种情况都是错误的。对象std::thread t1
一直存在,直到函数doTask
退出。然后,在callback_function
仍然有效时,线程对象正试图销毁。
您应该等待线程停止其工作,然后再将其删除。
int main(){
callback_function print = printer;
std::thread t1(printer);
// do some other stuff
t1.join();
}
关于c++ - 无法从指向函数的指针启动线程,C++,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31721882/