c - 无法理解 pthread_join()
c - can't understand pthread_join()
我不知道我哪里错了,在 运行 代码到达它运行 pthread_join()
的地方之后,许多 pthread_join()
return 与值 3 而不是 0。此外,打印 i
的值并不总是一致的,这会导致分段错误并在同一位置打印多次。
根据评论要求修改代码
所有包含都用于程序的其他部分。仅测试这段代码会在 pthread_join()
上的错误 3 处创建分段错误
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <config.h>
#include <sys/select.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
void *threadF(){
printf("hello\n");
pthread_exit((void*)0);
}
int main(int argc, char *argv[]) {
FILE *fileconf=fopen(argv[2],"r");
if(fileconf==NULL){
fprintf(stderr, "Fopen\n",argv[2]);
return -1;
}
set_conf(fileconf); //parse fileconf and set THREADSINPOOL correctly
pthread_t array[THREADSINPOOL];
int i,err,s=0;
for(i=0;i<THREADSINPOOL;i++){
if((err=pthread_create(&array[i],NULL,&threadF,NULL))!=0){
fprintf(stderr,"thread\n");
exit(errno);
}
}
int tmp;
for(i=0;i<THREADSINPOOL;i++){
tmp=pthread_join(array[i],(void *)&s);
printf("thread: %lu terminated\n tmp: %d\n",array[i],tmp);
}
return 0;
}
问题是您将 int
的地址传递给需要 void *
地址的函数。在 64 位系统上,int
很可能只是 32 位,而 void *
是 64 位。所以 pthread_join
最终将 64 位写入一个只够 32 位使用的位置。结果是你覆盖了不应该改变的内存,随之而来的是各种未定义的行为。
这是一种编写代码的方法,因此 pthread_join
的第二个参数实际上是指向 void *
的指针
for (i = 0; i < THREADSINPOOL; i++)
{
void *value;
if (pthread_join(array[i], &value) == 0)
printf("thread %d returned %" PRIiPTR "\n", i, (intptr_t)value);
else
printf("thread %d failed\n", i);
}
我不知道我哪里错了,在 运行 代码到达它运行 pthread_join()
的地方之后,许多 pthread_join()
return 与值 3 而不是 0。此外,打印 i
的值并不总是一致的,这会导致分段错误并在同一位置打印多次。
根据评论要求修改代码
所有包含都用于程序的其他部分。仅测试这段代码会在 pthread_join()
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <config.h>
#include <sys/select.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
void *threadF(){
printf("hello\n");
pthread_exit((void*)0);
}
int main(int argc, char *argv[]) {
FILE *fileconf=fopen(argv[2],"r");
if(fileconf==NULL){
fprintf(stderr, "Fopen\n",argv[2]);
return -1;
}
set_conf(fileconf); //parse fileconf and set THREADSINPOOL correctly
pthread_t array[THREADSINPOOL];
int i,err,s=0;
for(i=0;i<THREADSINPOOL;i++){
if((err=pthread_create(&array[i],NULL,&threadF,NULL))!=0){
fprintf(stderr,"thread\n");
exit(errno);
}
}
int tmp;
for(i=0;i<THREADSINPOOL;i++){
tmp=pthread_join(array[i],(void *)&s);
printf("thread: %lu terminated\n tmp: %d\n",array[i],tmp);
}
return 0;
}
问题是您将 int
的地址传递给需要 void *
地址的函数。在 64 位系统上,int
很可能只是 32 位,而 void *
是 64 位。所以 pthread_join
最终将 64 位写入一个只够 32 位使用的位置。结果是你覆盖了不应该改变的内存,随之而来的是各种未定义的行为。
这是一种编写代码的方法,因此 pthread_join
的第二个参数实际上是指向 void *
for (i = 0; i < THREADSINPOOL; i++)
{
void *value;
if (pthread_join(array[i], &value) == 0)
printf("thread %d returned %" PRIiPTR "\n", i, (intptr_t)value);
else
printf("thread %d failed\n", i);
}