无法从指向函数,C ++的指针启动线程

时间:2015-07-30 10:56:21

标签: c++ multithreading function pointers

我正在尝试执行以下操作的线程执行:

 #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);
}

有人知道我错过了什么或做错了吗?

2 个答案:

答案 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之前添加t1t1.join()