c - 从 C 中的线程返回值

标签 c multithreading pthreads

你好,我很难理解如何从 c 中的线程返回值。我有这个工作示例:

#define NTHREADS 4
void *neg (void * param) {
    int *l;
    l=(int *) param;
    int *r=(int *)malloc(sizeof(int));
    *r=-*l;
    return ((void *) r);
}

int main (int argc, char *argv[]) {
    pthread_t threads[NTHREADS];
    int arg[NTHREADS];
    int err;
    for(long i=0;i<NTHREADS;i++) {
    arg[i]=i;
    err=pthread_create(&(threads[i]),NULL,&neg,(void *) &(arg[i]));
    if(err!=0)
        error(err,"pthread_create");
    }
    for(int i=0;i<NTHREADS;i++) {
        int *r;
        err=pthread_join(threads[i],(void **)&r);
            printf("Resultat[%d]=%d\n",i,*r);
        free(r);
        if(err!=0)
            error(err,"pthread_join");
    }
    return(EXIT_SUCCESS);
}

我觉得很难理解的是:

函数 neg 返回一个在 (void *) 中转换的指针 * r 指向堆中的一个值。因此基本上将地址返回到堆中。然后在 pthread_join 中,我们通过执行 &r 获得返回值(这本身似乎不合逻辑?捕获地址的地址?)然后转换为指针的指针?我们为什么要这样做?

感谢您的帮助!

最佳答案

考虑这段代码,它完全有效并打印出“5 5 5 5”。

int x = 5;
int *p = &x;
int **pp = &p;
int ***ppp = &pp;
printf("%d %d %d %d\n", x, *p, **pp, ***ppp);
return 0;

C 允许您拥有任意深度的指针,并使用相应数量的寻址运算符进行初始化。在您的示例中,您分配了一个 int * 并且该函数必须返回一个 void **,因此您必须两次取消引用结果并将其转换,这是通过转换完成的int *

所以,“获取地址的地址?” 是的!好吧,一个指针的地址,它可能包含一个 int 或另一个指针的地址。

关于c - 从 C 中的线程返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37412052/

相关文章:

c - 生成随机字符串的C库函数是什么?

c - 如何添加证书文件以在没有文件系统的操作系统上设置 libcurl HTTPS 连接?

c# - 使用Xpcom.Shutdown(),Xpcom.Initialize(path)后的GeckoFx不能再使用

c - C 中使用共享变量和互斥锁进行线程同步

c - 在控制台应用程序中显示像素值的二维数组

基于未初始化值的条件移动,未初始化值由堆分配创建

java - 用于学习 Java 中的内存模型和线程安全的资源

multithreading - Scala并行集合: How to know and configure the number of threads

c++ - 尝试显示我的线程的优先级时出现段错误

C++ pthreads - 使用我在 C 中使用的代码给我一个转换错误