c-无法理解pthread_join()

时间:2018-08-15 17:39:22

标签: c multithreading pthreads threadpool pthread-join

我无法弄清楚哪里出错了,在运行代码到达pthread_join()所在的位置之后,许多pthread_join()返回的值是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;
}

1 个答案:

答案 0 :(得分: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);
}