Подтвердить что ты не робот

C, как создать поток, используя функцию pthread_create

Я создаю файл c для очереди отправки, которая получает задание и помещает ее в очередь, которая является связанным списком. Для этого мне нужно создать потоки, используя

pthread_t cThread;
if(pthread_create(&cThread, NULL, work, param)){
    perror("ERROR creating thread.");
}

Однако мне нужно сделать еще одну функцию, которая переходит в переменную "work" и "param" в качестве параметров функции create. Мой друг сказал мне, что мне просто нужно поместить любой код в функцию работы, которая бесконечно петлит, чтобы нить не умирала. Может ли кто-нибудь объяснить, что каждый параметр входит в функцию pthread_create, особенно для work и param? Я искал Google для этого, но большинство учебников настолько трудно понять концепцию...

4b9b3361

Ответ 1

Четыре параметра pthread_create имеют следующий порядок:

  • Указатель на структуру pthread_t, которая pthread_create заполняет информацию о создаваемом им потоке.

  • Указатель на pthread_attr_t с параметрами для потока. Вы можете безопасно просто пропустить NULL большую часть времени.

  • Функция для запуска в потоке. Функция должна возвращать void * и принимать аргумент void *, который вы можете использовать, как вы считаете нужным. (Например, если вы запускаете несколько потоков с одной и той же функцией, вы можете использовать этот параметр, чтобы различать их.)

  • void *, с которым вы хотите запустить поток. Передайте NULL, если он вам не нужен.

Ответ 2

поясняющий ответ duskwuff:

work параметр - это указатель на функцию. Функция должна принимать один аргумент, который обозначается как тип void * и возвращаемое значение void *.

Ожидается, что

param будет указателем на данные, которые получит work.

В качестве примера скажем, вы хотите передать два int работнику. Затем вы можете создать что-то вроде этого:

int *param = (int *)malloc(2 * sizeof(int));
param[0] = 123;
param[1] = 456;
pthread_create(&cThread, NULL, work, param);

Затем ваша рабочая функция может преобразовать тип указателя и захватить данные параметров:

void *work(void * parm) {
    int *param = (int *)parm;
    int first_val = param[0];
    ....
}

Вы можете делать более сложные вещи, например, создавать структуру со всеми данными, которые вам нужно передать.