gpt4 book ai didi

c - 多线程程序中的fork()

转载 作者:行者123 更新时间:2023-11-30 20:39:57 25 4
gpt4 key购买 nike

我在多线程中遇到一些 fork 问题,这是代码

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时,程序似乎陷入死锁,无限等待或出现一些问题,我不知道该怎么办。

最佳答案

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

不要将管道复制到文件描述符 0。您是在父进程中执行此操作,因此所有线程都在争夺谁的管道成为标准输入。只需从原始管道中读取:

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

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

此外,当您在父级中调用 wait(NULL) 时,它会在任何子级完成时返回,而不仅仅是特定线程刚刚启动的子级。您应该在此处调用 waitpid(),而不是在此处使用特定子进程的 PID。

关于c - 多线程程序中的fork(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com