Передать указатель на функцию на pthread_create()
Пишите только sum_line
, а не &sum_line(0)
.
Функция pthread_create()
ожидает указатель на функцию потока - то есть имя функции - а не результат вызова функции. Функция pthread_create()
организует вызов новой функции новым потоком, но для этого нужен указатель на функцию.
Кроме того, подпись для функции потока должна быть:
void *function(void *arg);
Функция также должна возвращать значение - добавьте return 0;
перед закрывающей фигурной скобкой.
Вы передаете нулевой указатель на функцию; Вы не можете ожидать, что это сработает как int nr_line
. Вам нужно будет сделать несколько модных шагов, чтобы получить номер функции.
Есть два основных варианта:
Или
int nr_line = 247;
pthread_create(&tid, NULL, sum_line, &nr_line);
Функция выглядит следующим образом:
void *sum_line(void *arg)
{
int nr_line = *(int *)arg;
…
return 0;
}
Просто убедитесь, что каждый поток получает указатель на другой объект при запуске нескольких потоков.
Или
uintptr_t nr_line = 247;
pthread_create(&tid, NULL, sum_line, (void *)nr_line);
Или:
int nr_line = 247;
pthread_create(&tid, NULL, sum_line, (void *)(uintptr_t)nr_line);
и функция выглядит следующим образом:
void *sum_line(void *arg)
{
int nr_line = (uintptr_t)arg;
…
return 0;
}
Двойное приведение позволяет избежать предупреждений компилятора о преобразовании целого числа другого размера в указатель.
Обратите внимание, что pthread_create()
будет вызывать функцию, как если бы она была void *function(void *args)
, поэтому передача ей любого другого типа указателя на функцию, даже если приведен с (void (*)(void *))
, обманывает и приводит к неопределенному поведению.