要求为一元'&“操作数的左值

时间:2019-01-24 17:57:31

标签: c linux pthreads

我的项目有一个问题,应该使用一个线程将每一行加起来,然后将其总和,但是我遇到一个错误,指出左值必须为一元'&“操作数

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 :(得分:2)

将指向函数的指针传递到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 *))进行转换,将任何其他类型的函数指针传递给它也会欺骗并导致未定义行为。