C, как создать поток, используя функцию pthread_create - PullRequest
16 голосов
/ 09 августа 2011

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

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

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

Ответы [ 2 ]

30 голосов
/ 09 августа 2011

Четыре параметра для pthread_create расположены в следующем порядке:

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

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

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

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

20 голосов
/ 09 августа 2011

уточняющий ответ сумеречного:

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];
    ....
}

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

...