我正在测试一个涉及在我的 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
所以这是我的问题:
- 在 ARMv8 设备上运行 64 位二进制文件时运行 32 位二进制文件有什么原因吗?
- 当我替换为 时,此错误如何
pthread_exit(0)
解决return 0
? - 还有什么我可能在这里遗漏的吗?
小更新:
我尝试更改等待时间并在所有可能的地方进行各种组合,pthread_join()
但无济于事。这是我能提供的最简单的版本。pthread_detach()
pthread_exit()