我正在尝试执行以下操作的线程执行:
#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);
}
有人知道我错过了什么或做错了吗?
答案 0 :(得分:4)
两种情况都是错误的。对象std::thread t1
生存,直到函数doTask
退出。然后线程对象试图在callback_function
仍然有效的情况下进行销毁
你应该等待线程停止它的工作,然后删除它。
int main(){
callback_function print = printer;
std::thread t1(printer);
// do some other stuff
t1.join();
}
答案 1 :(得分:1)
问题是主线程在 if button == nil{
println("Do nothing");
}else{
button!.tag = indexPath.row
}
线程完成其工作之前结束。您应该在退出doTask之前添加t1
或t1.join()
。