2012-01-19 39 views
3

这样的代码:在在pthread_create函数第四个参数

int code = pthread_create(&d->thread_id, &attr, QThreadPrivate::start, this); 

QThreadPrivate::start是静态函数。

那么,什么使用是第四个参数thisthis被替换为NULL有什么区别?

回答

3

pthread_create的第四个参数未触及线程函数,并允许该函数根据该参数更改行为。

关于pthread_create的OpenGroup文档详细介绍了这一点,可以找到here

在这种情况下,它只是将指针传递给当前对象,大概是这样start函数可以使用它来访问特定对象的成员变量。

如果通过NULL取而代之,创建的线程将获得NULL,并且将无法访问特定于对象的数据(不会因空指针解引用导致崩溃和严重烧毁)。

你可能会认为,因为QThreadPrivate::start是一个静态函数,它将无法以任何方式访问非静态成员(因为它通常没有可用的对象)。

但只适用于隐式访问 - 没有什么从通过明确this指针访问对象数据阻止你,为您提供按照访问规则(例如,没有进入私人数据)。

1

第四个参数在启动时传递给线程。 QThreadPrivate :: start可以使用它(在适当的强制转换后)来调用特定于对象的成员函数。

3

这是一个常见的习惯用法。你想要启动一个线程,但是你想让该线程在特定的对象上运行。所以你需要传递一个指向你想要操作的对象的指针。如果您在该对象的成员函数内,那么指针this指向您正在操作的对象。您不能直接将指针传递给成员函数(因为类型会不同),因此您使用静态成员函数,其唯一目的是将this指针转换回正确的类型并运行非静态成员函数。

如果您将this更改为NULL,则该线程将不知道它应该操作哪个对象。可能的话,QThreadPrivate::start会出错或失败,因为如果没有指向该实例的指针,它将无法调用实例上的非静态成员函数。

假设您有一个具有普通成员函数的类,该函数不接受参数并且不返回任何参数。你有一些代码不知道你的类或它的任何结构。您想给该代码足够的信息来在特定的类实例上调用该成员函数。你通过了什么?你不能传递一个指向成员函数的指针,因为不知道你的类,它不能调用一个普通的类成员函数。答案:您将它传递给一个静态成员函数的指针,该函数的实现将调用普通成员函数,并将它传递给您希望调用其方法的实例的指针。

相关问题