我正在测试一个小代码,它涉及在我的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: Why people bother using 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
所以这是我的问题:
pthread_exit(0)
替换为return 0
时,此错误如何解决?次要更新:
我尝试更改等待时间,并在所有可能的位置进行pthread_join()
,pthread_detach()
和pthread_exit()
的各种组合,但无济于事。这是我能提供的最简单的版本。