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是什么意思?未定义的行为