C++ 线程回调

C++ 线程回调,c++,multithreading,callback,C++,Multithreading,Callback,我的代码可能写错了: #include <iostream> #include <thread> using namespace std; void callback() { cout << "Callback called" << endl; } void task(void(*clb)()) { /* code... */ clb(); // (1) } int main() { thr

我的代码可能写错了:

#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();
}
#包括
#包括
使用名称空间std;
void callback()
{
cout1)回调的含义因人和语言而异。有些人将回调称为任何函数指针,其他人则说回调是作为函数参数传递的函数/函数指针或函数对象。我同意第二种说法。在这种情况下,void callback()函数衰减为函数指针。我不知道一个函子/函数对象是否也是回调,它肯定是可以调用的

2) clb();in task()函数正在调用回调函数。此时线程已经在运行

3) 调用函数指针还是函数取决于您。函数指针的优点在于,它们可以在运行时分配给其他函数,但它们是动态调度的。换句话说,函数调用不是编译为机器代码,而是通过指针调用的,这意味着程序需要查找其地址并运行函数指针和functor/Function objects/lambda允许很大的灵活性,但如果您不需要它,就不要使用它们

该行:

thread th1(task, callback);
正在创建一个新线程。第一个构造函数参数是线程将运行的函数。由于task()函数接受回调或函数指针,因此thread()中的第二个参数是函数,作为指针给定。在task()函数中,回调用

clb();
调用函数void callback()

创建新线程并执行回调函数

th1.join();
阻止当前线程,使main()线程无法继续,直到线程th1完成

th2.join();
阻塞主螺纹,直到th2螺纹完成

th2.join();

所谓线程完成,我指的是给定给线程构造函数的函数完成/返回时。

请每个问题问一个问题。因为这太宽泛了。