1

我正在测试一个涉及在我的 ARMv8 设备上创建线程的小代码。

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

void *fun(void *arg)
{
    sleep(2);
    printf("%s: Exiting now\n", __func__);
    pthread_exit(0);
    //return 0;
}

int main()
{
    pthread_t th;
    pthread_create(&th, NULL, fun, NULL);

    sleep(3);

    printf("%s: Wait over\n", __func__);

    return 0;
}

当我将代码编译成 32 位可执行文件并在设备上运行时,它似乎运行良好。

fun: Exiting now
main: Wait over

但是当我将它构建为 64 位可执行文件时,我得到以下输出:

fun: Exiting now
Aborted (core dumped)

据我所知,ARMv8 是完全向后兼容的。但是在这里,32 位二进制文​​件运行,而 64 位二进制文​​件挂起。

除此之外,在尝试事物时,我发现将 fun() 更改为:

void *fun(void *arg)
{
    sleep(2);
    printf("%s: Exiting now\n", __func__);
    //pthread_exit(0);
    return 0;
}

32 位和 64 位二进制文​​件都运行良好。

我查看了这篇文章: Pthread:为什么人们会费心使用 pthread_exit?并且没有得到太多关于问题可能出在哪里的信息。

以下是有关我的设备的更多信息:

Linux Version: Linux version 4.4.67 (lnxbuild@ecbld-bd213-lnx) (gcc version 4.9.3 (GCC) ) #1 SMP PREEMPT
Total Memory : 3721056

所以这是我的问题:

  1. 在 ARMv8 设备上运行 64 位二进制文​​件时运行 32 位二进制文​​件有什么原因吗?
  2. 当我替换为 时,此错误如何pthread_exit(0)解决return 0
  3. 还有什么我可能在这里遗漏的吗?

小更新:

我尝试更改等待时间并在所有可能的地方进行各种组合,pthread_join()但无济于事。这是我能提供的最简单的版本。pthread_detach()pthread_exit()

4

0 回答 0