线程回调

时间:2018-03-05 21:40:39

标签: 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()
{
    thread th1(task, callback);
    thread th2(callback);
    th1.join();
    th2.join();
}

1)术语回调和线程之间的联系或动机是什么?

2)行标记(1)这只是一个使用函数指针的函数调用(回调)还是我调用一个线程?

3)我什么时候应该在线程内部使用回调?何时只是函数调用?

1 个答案:

答案 0 :(得分:1)

1)回调的含义因人与语言而异。有些人调用回调任何函数指针,其他人说回调是函数/函数指针或作为函数参数传递的函数对象。我同意第二个。在这种情况下,void callback()函数衰减为函数指针。无论函子/函数对象是否也是回调函数,我都不知道。它绝对可以赎罪。

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

3)是否调用函数指针或函数取决于您。函数指针的优点在于它们可以在运行时分配给其他函数,但它们是动态分派的。换句话说,函数调用不是编译为机器代码,而是通过指针调用,这意味着程序需要查找其地址并运行它。这比较慢。函数指针和函子/函数对象/ lambda可以提供很大的灵活性,但是如果你不需要它,那么就不要使用它们。

该行:

thread th1(task, callback);

正在创建一个新线程。第一个构造函数参数是线程将运行的函数。因为task()函数接受回调或函数指针,所以thread()中的第二个参数是作为指针给出的函数。在task()函数内部,使用

调用回调
clb();

调用函数void callback();

thread th2(callback);

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

th1.join();

阻止当前线程,你的main()线程继续,直到线程th1结束。

th2.join();

阻止主线程直到第2个线程结束。

通过线程完成,我的意思是给予线程构造函数的函数完成/返回。