C 关于pthread_join函数的问题
为什么会发生这种情况?源代码来自C 关于pthread_join函数的问题,c,linux,C,Linux,为什么会发生这种情况?源代码来自 既然我不熟悉汇编语言,谁能帮我分析一下原因 如果在线程中没有返回任何内容,则函数是UB,使用-O0编译器会自动解决此问题。事实上,您的功能是: [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
既然我不熟悉汇编语言,谁能帮我分析一下原因 如果在
线程中没有返回任何内容,则函数是UB,使用-O0
编译器会自动解决此问题。事实上,您的功能是:
[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 .
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
编译时,您的函数是:
[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 .
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
另外,如果您不知道汇编,您可以理解这个过程只是返回,而不做任何事情,除非您添加返回一个代码>在线程_函数的末尾,函数变为:
thread_function:
ret
现在,如果您执行该程序,则输出是正确的。您的thread\u函数中没有return语句
,从而导致未定义的行为。如果返回一个代码>顺便说一句,为什么要以root用户身份运行gcc和编译的二进制文件?@ChristianGibbons谢谢,但我在man pthread_exit()中找不到任何内容,顺便说一下,这只是一个在局域网上运行的虚拟机,所以不必介意。UB是什么意思?未定义的行为