我有这个代码,可能写错了:
#include <iostream>
#include <thread>
using namespace std;
void callback()
{
cout << "Callback called" << endl;
}
void task(void(*clb)())
{
/* code... */
clb(); // (1)
}
int main()
{
thread th1(task, callback);
thread th2(callback);
th1.join();
th2.join();
}
1)术语回调和线程之间的联系或动机是什么?
2)行标记(1)这是一个只使用函数指针的函数调用(回调)还是我调用一个线程?
3)什么时候应该从线程内部使用回调,何时只是函数调用?
1)回调的含义因人和语言而异。有些人调用回调任何函数指针,其他人说回调是函数/函数指针或作为函数参数传递的函数对象。我同意第二个。在这种情况下,void callback()函数衰减为函数指针。函数/函数对象是否也是回调,我不知道。它绝对是可以调用的。
2)clb();在task()函数中只是调用回调函数。此时线程已在运行。
3)是否调用函数指针或函数由您决定。函数指针的优点在于它们可以在运行时分配给其他函数,但它们是动态调度的。换句话说,函数调用不会被编译为机器代码,它通过指针调用,这意味着程序需要查找其地址并运行它。这比较慢。函数指针和函子/函数对象/ lambdas允许很大的灵活性,但如果你不需要它,那么就不要使用它们。
这条线:
thread th1(task, callback);
正在创建一个新线程。第一个构造函数参数是线程将运行的函数。因为task()函数接受回调或函数指针,所以thread()中的第二个参数是作为指针给出的函数。在task()函数内部调用回调函数
clb();
其中调用函数void callback();
thread th2(callback);
创建一个新线程并执行回调函数。
th1.join();
阻止当前线程,你的main()线程继续,直到线程th1结束。
th2.join();
阻止主线程直到th2线程完成。
通过线程完成我的意思是给予线程构造函数的函数完成/返回。