使用一个参数调用 pthread_join 会导致分段错误?
Calling pthread_join with one argument causes a segmentation fault?
如果我连续调用pthread_join(不使用其他函数)会导致分段错误。
我可以通过在 pthread_join.
的两次调用之间插入 sleep();
、 printf()
或任何其他内容来解决问题
OS & GCC 版本:
gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
编译命令:
gcc demo_thread.c -lpthread -o demo_thread.out
源代码(demo_thread.c):
#include <stdio.h>
#include <stdlib.h>
void *f1(void *);
int main() {
int k = 2;
pthread_t fa[k];
for(int i=0; i<k; i++) {
pthread_create(&fa[i], NULL, f1, NULL);
}
for(int i=0; i<k; i++) {
// printf("%ul\n", fa[i]); // uncomment this line, problem disapper.
pthread_join(fa[i]);
}
}
void *f1(void *arg) {
for(int i=0; i<4;i++) {
printf("%d\n",i );
}
return 0;
}
你是怎么编译的?我刚刚意识到你没有使用 #include <pthread.h>
并且你为 pthread_join
.
使用了一个参数而不是两个参数
如果我省略包含,我会得到
error: unknown type name ‘pthread_t’
如果我确实包含它,那么我会得到
error: too few arguments to function ‘pthread_join’
哦,我看到如果我包含 #include <stdlib.h>
并省略 <pthread.h>
,那么它将有 pthread_t
的定义,但没有 pthread_join
的定义。不过仍然有很多警告:
warning: implicit declaration of function ‘pthread_join’
您应该始终使用编译器的 -Wall -W -pedantic
参数构建程序。并修复警告。
并解释崩溃:由于您没有将 NULL 作为第二个参数传递给 pthread_join
,它将接收一个“随机”值,然后将其写入,就好像它是一个指针一样。它不是。因此它要么将一个值写入您分配的内存中不应该写入的位置,要么会出现分段错误。
并解释 printf
或 sleep
如何解决问题:进行这些函数调用必须更改 RSI
寄存器的值(RSI 用于第二个函数参数)足够它是一个有效的指针或 NULL。
如果我连续调用pthread_join(不使用其他函数)会导致分段错误。
我可以通过在 pthread_join.
的两次调用之间插入sleep();
、 printf()
或任何其他内容来解决问题
OS & GCC 版本:
gcc --version
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
编译命令:
gcc demo_thread.c -lpthread -o demo_thread.out
源代码(demo_thread.c):
#include <stdio.h>
#include <stdlib.h>
void *f1(void *);
int main() {
int k = 2;
pthread_t fa[k];
for(int i=0; i<k; i++) {
pthread_create(&fa[i], NULL, f1, NULL);
}
for(int i=0; i<k; i++) {
// printf("%ul\n", fa[i]); // uncomment this line, problem disapper.
pthread_join(fa[i]);
}
}
void *f1(void *arg) {
for(int i=0; i<4;i++) {
printf("%d\n",i );
}
return 0;
}
你是怎么编译的?我刚刚意识到你没有使用 #include <pthread.h>
并且你为 pthread_join
.
如果我省略包含,我会得到
error: unknown type name ‘pthread_t’
如果我确实包含它,那么我会得到
error: too few arguments to function ‘pthread_join’
哦,我看到如果我包含 #include <stdlib.h>
并省略 <pthread.h>
,那么它将有 pthread_t
的定义,但没有 pthread_join
的定义。不过仍然有很多警告:
warning: implicit declaration of function ‘pthread_join’
您应该始终使用编译器的 -Wall -W -pedantic
参数构建程序。并修复警告。
并解释崩溃:由于您没有将 NULL 作为第二个参数传递给 pthread_join
,它将接收一个“随机”值,然后将其写入,就好像它是一个指针一样。它不是。因此它要么将一个值写入您分配的内存中不应该写入的位置,要么会出现分段错误。
并解释 printf
或 sleep
如何解决问题:进行这些函数调用必须更改 RSI
寄存器的值(RSI 用于第二个函数参数)足够它是一个有效的指针或 NULL。