lvalue требуется как унарный '& "операнд - PullRequest
0 голосов
/ 24 января 2019

У меня есть проблема с моим проектом, который должен складывать каждую строку с использованием потока, а затем суммировать все, но я получаю сообщение об ошибке, которое говорит, что lvalue требуется как унарный '& "operand

pthread_create (& tid, NULL, & sum_line (0), NULL);

Я попробовал кое-что, но не смог решить, есть идеи? Спасибо

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
static void * sum_line(int nr_line);

int Sum;
int A[4][4];

int main() {
  pthread_t tid;
  Sum=0;
  printf("\nOrig thread tid(%d) Sum=%d", pthread_self(), Sum);
  pthread_create(&tid, NULL, &sum_line(0), NULL);
  printf("\nChild thread was created tid(%d)", tid);
  pthread_join(tid,NULL);
  printf("\nOrig thread tid(%d)-->Child thread ended tid(%d) Sum=%d",pthread_self(), tid, Sum);
  printf("\n");

}

static void * sum_line(int nr_line) {
    int i;
    for(i=0;i<4;i++) {
        Sum=Sum+A[i];
        printf("\nChild thread tid(%d), i=%d, Sum=%d",pthread_self(),i,Sum);
        sleep(2);
    }
    printf("\nChild thread tid(%d)--> ending", pthread_self());
}

1 Ответ

0 голосов
/ 24 января 2019

Передать указатель на функцию на 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 *)), обманывает и приводит к неопределенному поведению.

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