我在多线程中有一些问题,这里是代码
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时,程序似乎陷入僵局,无限等待或出现问题,我不知道该怎么做。
答案 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。