gpt4 book ai didi

c - 关于pthread_join函数的问题

转载 作者:行者123 更新时间:2023-12-03 09:55:20 25 4
gpt4 key购买 nike

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

void* thread_function(void *ignoredInThisExample)
{
char *a = malloc(20);
strcpy(a,"hello world");
}

int main()
{
pthread_t thread_id;
char *b;

pthread_create (&thread_id, NULL,&thread_function, NULL);

pthread_join(thread_id,(void**)&b); //here we are reciving one pointer
//value so to use that we need double pointer
printf("b is %s.\n",b);

return 0;
}

使用 -O0-O1编译并运行:
[root c++]#gcc -g -O0 -o pthread pthread.c -lpthread
[root c++]#
[root c++]#
[root c++]#./pthread
b is hello world.
[root c++]#
[root c++]#
[root c++]#gcc -g -O1 -o pthread pthread.c -lpthread
[root c++]#
[root c++]#./pthread
b is .

为什么会这样? pthread_join() and pthread_exit()的源代码
由于我不熟悉汇编语言,因此有人可以帮助我分析原因吗? online assembly

最佳答案

如果您的thread_function内部没有返回任何内容,则是UB,使用-O0,编译器会自动解决此问题。实际上,您的功能是:

thread_function:
push rbp
mov rbp, rsp
sub rsp, 32
mov QWORD PTR [rbp-24], rdi
mov edi, 20
call malloc
mov QWORD PTR [rbp-8], rax
mov rax, QWORD PTR [rbp-8]
movabs rdx, 8031924123371070824
mov QWORD PTR [rax], rdx
mov DWORD PTR [rax+8], 6581362
nop
leave
ret

但是,当您使用 -O1进行编译时,您的函数是:
thread_function:
ret

另外,如果您不知道Assembly,则可以理解该过程只是不执行任何操作而返回,但是如果您在 return a;的末尾添加 thread_function,则函数将变为:
thread_function:
sub rsp, 8
mov edi, 20
call malloc
movabs rdx, 8031924123371070824
mov QWORD PTR [rax], rdx
mov DWORD PTR [rax+8], 6581362
add rsp, 8
ret

现在,如果您执行该程序,则输出正确。

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

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