Четвертый параметр в функции pthread_create - PullRequest
3 голосов
/ 19 января 2012

Код, подобный следующему:

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

, который QThreadPrivate::start является статической функцией.

Итак, для чего нужен четвертый параметр this?И какая разница, если this заменить на NULL?

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Это распространенная идиома. Вы хотите запустить поток, но хотите, чтобы этот поток работал с определенным объектом. Поэтому вам нужно передать потоку указатель на объект, с которым вы хотите, чтобы он работал. Если вы находитесь в функции-члене для этого объекта, указатель this указывает на объект, с которым вы работаете. Вы не можете передать указатель на функцию-член напрямую (потому что тип будет другим), поэтому вы используете статическую функцию-член, единственная цель которой - привести указатель this обратно к правильному типу и запустить нестатический функция-член.

Если вы измените this на NULL, поток не будет знать, с каким объектом он должен работать. Скорее всего, QThreadPrivate::start выйдет из строя или потерпит неудачу, поскольку он не сможет вызвать нестатическую функцию-член в экземпляре без указателя на этот экземпляр.

Скажем, у вас есть класс с нормальной функцией-членом, которая не принимает параметров и не возвращает параметров. У вас есть код, который не имеет представления о вашем классе или какой-либо его структуре. Вы хотите дать этому коду достаточно информации для вызова этой функции-члена в конкретном экземпляре класса. Что вы передаете это? Вы не можете передать ему указатель на функцию-член, потому что, не имея представления о вашем классе, он не может вызвать обычную функцию-член класса. Ответ: Вы передаете ему указатель на статическую функцию-член, реализация которой вызывает обычную функцию-член, и вы передаете ему указатель на экземпляр, метод которого вы хотите, чтобы он вызывал.

3 голосов
/ 19 января 2012

Четвертый параметр pthread_create передается в функцию потока без изменений и позволяет этой функции изменять поведение на основе этого аргумента.

Документация OpenGroup для pthread_create, подробно это можно найти здесь .

В этом случае он просто передает указатель на текущий объект, предположительно, чтобы функция start могла использовать его для доступа к переменным-членам для конкретного объекта.

Если вместо этого вы передадите NULL, созданный поток получит NULL и не сможет получить доступ к данным, относящимся к объекту (без сбоев и плохого прожига с разыменованием нулевого указателя).

Вы можете подумать, что, поскольку QThreadPrivate::start является статической функцией, она не сможет получить доступ к нестатическим членам каким-либо образом (так как обычно у нее нет объекта для работы).

Но это относится только к неявному доступу - ничто не мешает вам получить доступ к данным объекта через явный this указатель, при условии, что вы следуете правилам доступа (например, нет доступа к частным данным).

1 голос
/ 19 января 2012

Четвертый параметр передается потоку при его запуске.QThreadPrivate :: start может использовать его (после соответствующего приведения) для вызова специфичной для объекта функции-члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...