gpt4 book ai didi

c - 左值需要作为一元 '&"操作数

转载 作者:太空宇宙 更新时间:2023-11-04 07:50:11 29 4
gpt4 key购买 nike

我的项目有一个问题,它应该使用一个线程将每一行相加,然后将它们全部相加,但是我收到一个错误,指出左值需要作为一元 '&"操作数

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 *)) 进行转换,则会作弊并导致未定义的行为。

关于c - 左值需要作为一元 '&"操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54352768/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com