fork()在多线程程序中

时间:2014-07-30 19:24:23

标签: c multithreading fork posix

我在多线程中有一些问题,这里是代码

node_visited *visited, *it;


sem_t visited_q, elements;


char mode;

int count = 0;


int nthreads;


void *work_1 (void* args){

    int linf, i, lsup, status;
    linf = (int)args;
    char *path, buff[256];
    pid_t pid;
    linf = linf * (count/nthreads);

    lsup = linf  + (count/nthreads);
    //printf("%d\n",count );
    printf("Soy el hilo %d limite inferior: %d limite superior: %d numero de threads: %d numero de elementos: %d\n", (int) args, linf, lsup, nthreads, count);



    if (mode == 'e') {

   int j,fd[2];

        for (j = linf; j < lsup; j++) {


            pipe(fd);
            pid = fork();

            if (pid == 0) {

                //fflush(stdout);
                dup2(fd[1], STDOUT_FILENO);
                //printf("Antes del execl()\n");

        //sem_wait(&visited_q);
                execl("md5","md5", visited[j].path, NULL);
        //sem_post(&visited_q);

            } else if (pid > 0) {

                wait(NULL);
                dup2(fd[0], 0);
                scanf("%s",buff);
        //sem_wait(&visited_q);
                strcpy(visited[j].hashstr, buff);
        printf("%s\n",visited[j].hashstr );
        //sem_post(&visited_q);
            }
        }

    } else if (mode == 'l') {
        for (i = linf; i < lsup; i++) {
            status = MDFile ( visited[i].path, visited[i].hashstr);
        }
    }

}

程序必须访问由指令行参数给出的目录中的所有文件(我用getopt读取它)然后我必须使用线程获取md5哈希,有问题,当调用fork()时,带1, 2个和3个线程以及一个包含25个文件的目录,工作正常,但是当线程数大于3时,程序似乎陷入僵局,无限等待或出现问题,我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

else if (pid > 0) {
    ...
    dup2(fd[0], 0);
    scanf("%s",buff);

不要将管道复制到文件描述符0.您在父进程中执行此操作,因此所有线程都在争夺其管道变为stdin。只需阅读原始管道:

    FILE *pipe = fdopen(fd[0], "r");
    fscanf(pipe, "%s", buff);
    fclose(pipe);

免责声明:我的c有点生疏。

此外,当您在父级中调用wait(NULL)时,它将在任何子项完成时返回,而不仅仅是特定线程刚启动的子级。你应该在这里用waitpid()来代替特定孩子的PID。