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