首页 > 解决方案 > 需要左值作为一元“&”操作数

问题描述

我的项目有一个问题,它应该使用一个线程将每一行相加,然后将它们全部相加,但我收到一个错误,提示 lvalue required as unary '&" 操作数

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());
}

标签: clinuxpthreads

解决方案


将指向函数的指针传递给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 *))转换,也是作弊并导致未定义的行为。


推荐阅读