c - 需要左值作为一元“&”操作数
问题描述
我的项目有一个问题,它应该使用一个线程将每一行相加,然后将它们全部相加,但我收到一个错误,提示 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());
}
解决方案
将指向函数的指针传递给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 *))
转换,也是作弊并导致未定义的行为。
推荐阅读
- mysql - 如何从 user 和 usermeta 表中选择最后一个用户信息?
- angular - 在 app.component.ts 中的 init 上运行函数
- java - 从tomcat java运行Webdriver
- java - TOTP / HOTP / HmacSHA256 与 Java 中的无符号字节密钥
- mysql - Hack : 将数据从 pi3 发送到服务器云
- angular - 在 Angular 上将样式作为模块导入
- javascript - 如果日期更多是页面加载时定义的日期,如何添加类
- android - 无法在最新的 android studio 中解决依赖问题。为什么以及最新的android studio中的问题是什么
- api - 在 softlayer 上配置网络网关时无法过滤具有服务器的数据中心
- mysql - MySQL触发器在插入另一个表后更新一个表中的字段