gpt4 book ai didi

c - 取消引用由 pthread_join 设置的指针时的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:16 27 4
gpt4 key购买 nike

我有以下代码用于测试如何使用 pthread_exit()pthread_join()“实现返回值”。

#include <stdio.h>
#include <pthread.h>

void* busy() {

int returnValue = 2;
pthread_exit((void*)&returnValue);

}


int main() {

void* retVoidPtr = NULL;
int* retValPtr = NULL;
int retVal;

pthread_t busyThread;
pthread_create(&busyThread, NULL, busy, NULL);
pthread_join(busyThread, &retVoidPtr);
retValPtr = (int*) retVoidPtr;
retVal = *retValPtr;

printf("Busy thread returned %d\n", retVal);

return 0;

}

程序编译正常,但从未到达 printf 语句。段错误发生在行 retVal = *retValPtr 处。使用 gdb,我可以看到 retValPtr 指针不再是 NULL 但是当我尝试 print *retValPtr gdb 说“无法访问地址处的内存0x...”。有什么我出错的建议吗?

最佳答案

最佳 情况下,C 函数不能返回指向堆栈上的值的指针。但是,如果该堆栈是已终止线程的堆栈,那么我们正在谈论彻底的灾难,因为该线程堆栈的内存可能不再被映射——这似乎是这里的情况。

您的线程函数需要返回一个指向数据的指针,该数据在线程终止时将保持有效:一个全局变量,或从 malloc() 获得的 block 。

关于c - 取消引用由 pthread_join 设置的指针时的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9685105/

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