线程回调[关闭]

问题描述 投票:-2回答:1

我有这个代码,可能写错了:

#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)什么时候应该从线程内部使用回调,何时只是函数调用?

c++ multithreading callback
1个回答
1
投票

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线程完成。

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

© www.soinside.com 2019 - 2024. All rights reserved.