gpt4 book ai didi

c - pthread_join void **retval

转载 作者:行者123 更新时间:2023-12-02 21:03:08 26 4
gpt4 key购买 nike

我在尝试访问 pthread_join 的第四个参数时遇到段错误。这是我的代码:

void* threadHandler(void* arg)
{
printf("arg: %c\n", *(char *) arg);
pthread_exit(0);
}

int main()
{
pthread_t threadA;
pthread_create(&threadA, NULL, threadHandler, "N");

void *retval;
pthread_join(threadA, &retval);

printf("retval: %d\n", *(int *) retval);

return 0;
}

知道为什么最后一个 printf 会导致段错误吗?我如何解决它? (我的理解是retval应该包含threadHandler的返回值,所以在这种情况下,它应该是0,对吧?)

提前致谢!

最佳答案

如果您了解 pthread_join() 将选择线程回调的返回值,那么您应该像这样返回

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

void *
threadHandler(void *data)
{
printf("arg: %s\n", (char *) data);
return (void *) 0;
}

int
main(void)
{
pthread_t thread;
const char *string;
void *number;

string = "N";
if (pthread_create(&thread, NULL, threadHandler, (void *) string) != 0)
return -1;
pthread_join(thread, &number);
printf("%d\n", ((int) (intptr_t) number));
return 0;
}

但请注意,返回的地址 0x00 可能不是有效地址 - 通常是 NULL 指针 (void *) 0x00 code> - 因此,只要您有兴趣使用指针的值作为要返回的整数,您就应该这样做。

取消引用指针是未定义行为,但使用值则不是。

关于c - pthread_join void **retval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37345714/

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