这样的代码:
int code = pthread_create(&d->thread_id, &attr, QThreadPrivate::start, this);
QThreadPrivate::start
是一个静态函数。
那么,第四个参数this
有什么用?如果将this
替换为NULL
,那么有什么区别?
答案 0 :(得分:3)
pthread_create
的第四个参数不受影响地传递给线程函数,并允许该函数根据该参数更改行为。
pthread_create
的OpenGroup文档,详细说明了这一点,可以找到here。
在这种情况下,它只是将指针传递给当前对象,可能是因为start
函数可以使用它来访问特定对象的成员变量。
如果您改为传递NULL
,则创建的线程将获得NULL
,并且将无法访问特定于对象的数据(不会因空指针取消引用而崩溃和烧毁)。
您可能认为,因为QThreadPrivate::start
是一个静态函数,它无法以任何方式访问非静态成员(因为它通常没有可用的对象)。
但这仅适用于隐式访问 - 没有什么能阻止您通过显式 this
指针访问对象数据,只要您遵循访问规则(例如,无法访问私有数据) )。
答案 1 :(得分:3)
这是一个常见的习语。您想要启动一个线程,但您希望该线程对特定对象进行操作。因此,您需要将指针传递给您希望其操作的对象。如果您在该对象的成员函数内,this
指针指向您正在操作的对象。您不能直接将指针传递给成员函数(因为类型会有所不同),因此您使用静态成员函数,其唯一目的是将this
指针强制转换回正确的类型并运行非 - 静态成员函数。
如果您将this
更改为NULL
,则线程将不知道它应该在哪个对象上运行。可能,QThreadPrivate::start
会出错或失败,因为如果没有指向该实例的指针,它将无法在实例上调用非静态成员函数。
假设您有一个具有普通成员函数的类,该函数不带参数并且不返回任何参数。您有一些代码不知道您的类或其任何结构。您希望为该代码提供足够的信息来在特定的类实例上调用该成员函数。你通过什么?你不能传递一个指向成员函数的指针,因为不知道你的类,它不能调用普通的类成员函数。答案:您传递一个指向静态成员函数的指针,该函数的实现调用普通成员函数,并向它传递一个指向您希望它调用其方法的实例的指针。
答案 2 :(得分:1)
第四个参数在启动时传递给线程。 QThreadPrivate :: start可以使用它(在适当的强制转换后)来调用对象特定的成员函数。