我正在尝试执行以下操作来启动线程执行:

 #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/

10-11 18:09