Как работает эта функция с несколькими пустыми указателями? - PullRequest
0 голосов
/ 22 декабря 2018

У меня есть пример кода о создании потока в C. В той части, где я создаю поток, я не понимаю, для чего нужны все указатели void, и что они делают.

void* pthread_function(int thread_id) {
    pthread_mutex_lock(&mutex);
    printf("I'm thread number %d in mutual exclusión\n",thread_id);
    pthread_mutex_unlock(&mutex);
    pthread_exit(NULL);
}
int main(int argc,char** argv) {
    // Init mutex
    pthread_mutex_init(&mutex,NULL);
    // Create threads
    pthread_t thread[NUM_THREADS];
    long int i;
    for (i=0;i<NUM_THREADS;++i) {
        pthread_create(thread+i,NULL,(void* (*)(void*))pthread_function (void*)(i));
    }

}

Как здесь работают указатели?

pthread_create(thread+i,NULL,(void* (*)(void*))pthread_function (void*)(i));

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 22 декабря 2018

Предполагается, что функция потока имеет следующую подпись:

void *thread_func(void *thread_param);

Если у вас есть такая функция, вы можете создать поток с ней без такого беспорядка приведения:

void *thread_func(void *thread_param)
{
  printf("Success!\n");
  return NULL;
}

...
pthread_t thread_var;
int param = 42;
int result = pthread_create(&thread_var, NULL, thread_func, &param);

К сожалению, функция потока в вашем примере не имеет правильной подписи.Поэтому автор решил не исправлять это, а возиться со странными приведениями.

Тип функции - (void*(*)(void*)).Автор пытается свести концы с концами при преобразовании функции потока:

(void* (*)(void*))pthread_function

Но затем вводится еще одна ошибка: не приведен адрес функции, но вызывается функция, и для преобразования используется возвращаемое значение:

pthread_function (void*)(i)

Это даже не компилируется, поскольку это синтаксическая ошибка.Вероятно, это должно быть

pthread_function((void*)i)

Или это может быть так:

pthread_create(thread+i,NULL,(void* (*)(void*))pthread_function, (void*)(i));

Но так как все это в любом случае неправильно, это не имеет значения.

Вам лучше поискать правильный пример для создания темы.

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