Вопрос, который у меня возник, заключается в том, что именно представляет собой формат функции 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-машине для меня немного обременительна.