pthread_create формат функции и указатели - C Linux POSIX библиотека - PullRequest
1 голос
/ 26 октября 2011

Вопрос, который у меня возник, заключается в том, что именно представляет собой формат функции pthread_create и вызываемой ею функции, с точки зрения указателей и тому подобного?Я могу обернуть голову вокруг переменных указателей, хотя мне нужно уточнить свои знания в этой области, но указатели на функции становятся неуместными.

Я понимаю, что предпочтительный формат -

void *threadfunc(void *arg);

int main()
{
    pthread_t threadinfo;
    int samplearg;
    pthread_create(&threadinfo, NULL, threadfunc, &samplearg);
}

Однако этогенерирует предупреждение компилятора о том, что threadfunc не возвращает значение, поэтому очевидно, что * это что-то из того, что возвращает threadfunc, а не характеристика функции?

Я также видел функцию, определенную как и pthread_create, отформатированный так:

void threadfunc(void *arg);

pthread_create(&threadinfo, NULL, (void *)threadfunc, &samplearg);

Какие из этих двух правильные, или они функционально эквивалентны?Может ли кто-нибудь объяснить мне механизм указателей на функции и тому подобное?

Последний вопрос: будет ли он работать внутри цикла for, генерирующего несколько потоков, инициализировать int samplearg для уникальных значений потока и затем передавать егоpthread_create(...)?Я понимаю, что samplearg будет находиться в области видимости внутри threadfunc, я просто проверяю, как-то С не следует типичным правилам области видимости - поскольку samplearg создается внутри цикла for() и обычно выходит из строяобласти видимости после итерации цикла for(), и передается фактическая переменная, а не значение.Я бы проверил себя, но, возможно, в какой-то момент вы могли бы меня просветить, и разработка на удаленной Linux-машине для меня немного обременительна.

Ответы [ 3 ]

1 голос
/ 26 октября 2011

Вы не указали свою версию void *threadfunc(void *arg);, но я предполагаю, что в ней нет оператора return. Вот почему компилятор предупреждает вас. Поскольку в объявлении говорится, что оно должно вернуть void*, вы должны вернуть void*. void* - указатель на любой тип указателя. Только void (без звездочки) не нуждается в операторе return, потому что он ничего не возвращает.

Между прочим, возвращаемое значение будет передано в оператор pthread_join, когда другой поток присоединится к потоку, который вы в данный момент запускаете.

1 голос
/ 26 октября 2011

Перейти к «источнику» - стандарту POSIX.Для pthread_create() он говорит:

int pthread_create(pthread_t *restrict thread,
   const pthread_attr_t *restrict attr,
   void *(*start_routine)(void*), void *restrict arg);

То есть ваша 'start_routine' должна быть функцией, которая возвращает void * и которая принимаетvoid * аргумент.

void *possible_thread_start_routine(void *data)
{
    SomeStruct *info = data;
    ...main code for thread...
    return 0;
}

Аргумент, передаваемый в процедуру запуска потока, - это аргумент, указанный в arg - pthread_create().

0 голосов
/ 26 октября 2011

Функция, переданная в pthread_create(), должна возвращать указатель void, который указывает на состояние выхода потока.

Это возвращаемое значение доступно вам, когда вы вызываете pthread_join() в потоке после его выхода (путем возврата или явного вызова pthread_exit())

...