【问题标题】:Questions about the pthread_join function关于 pthread_join 函数的问题
【发布时间】:2020-06-04 16:51:55
【问题描述】:
#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 中没有返回语句,导致未定义的行为。如果您return a; 还会发生这种情况吗
  • 顺便说一句,你为什么以 root 运行 gcc 和你编译的二进制文件?
  • @ChristianGibbons 谢谢,但是我在 man pthread_exit() 中什么也没找到,顺便说一下,这只是一个在局域网上运行的虚拟机,所以不要介意。

标签: c linux


【解决方案1】:

如果您在thread_function 中没有返回任何内容,则-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

另外,如果你不懂汇编,你可以理解这个过程只是返回而不做任何事情,但是如果你在thread_function 的末尾添加return a;,你的函数变成:

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

现在如果你执行程序,输出是正确的。

【讨论】:

  • UB是什么意思?
  • 未定义的行为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多