Pthread_join 打印

Pthread_join Printf

我正在研究这个问题,但我不理解其中的一部分。该脚本不是英文的,因此翻译起来会很乏味,但基本问题是让线程读取特定的文本文件并找到特定的单词。每个文件都有自己的线程等等。最后 2 个问题是确保同一文件上的各种事件被打印在一起,例如:

file1: line 1
file1: line 2
file2: line 1

等等。我可以使用全局二维数组并创建一个结构来将它的 "id" 和它必须搜索的 txt 文件的名称传递给线程来解决这个问题。我使用了 pthread_join,它非常直观。问题出在下一个问题中,解决同样的问题但没有pthread_join,并且尽可能不忙等待。问题是,如果我不使用 pthread_join,我就无法在线程函数上打印任何内容,我没想到会这样?发生这种情况有原因吗?

这是我用来解决问题 pthread_join的代码。没有 pthread_join,使用互斥锁并尝试在线程函数上打印输出,我没有输出。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<errno.h>
#include<fcntl.h>
#include <pthread.h>
#define k 4
#define l 100

int match_line(int fd, char *str);
void *ocorre(void *);

char string[100];
int b[k][l];
int max;

struct args{
    char str[256];
    int id;
};
int main(int argc, char *argv[]){

    int i=0;
    int j=0;
    max=argc-1;

    struct args arg[max];
    pthread_t a[max];

    strcpy(string,argv[1]); //global

    for(i=0;i<max-1;i++){   //criaçao de threads
        arg[i].id=i;
        strcpy(arg[i].str,argv[i+2]);
        pthread_create(&a[i],NULL,ocorre,&arg[i]);
    }

    for(i=0;i<max-1;i++){ //join
        pthread_join(a[i],NULL);
            for(j=0;b[i][j]!=0;j++){
                printf("%s : %d\n",arg[i].str,b[i][j]);
            }
    }
}
void *ocorre(void *arg) {

    int fd;
    int j=0;
    struct args func;
    func=*(struct args*)arg;

    fd=open(func.str,O_RDONLY);
        while(1){
        b[func.id][j]=match_line(fd,string);
            if(b[func.id][j]==0) 
                break;
        j++;
    }

    return NULL;
}

This is what i did to try to solve without pthread_join. To obtain the first output i have to add sleep(1) after creating the thread

main 返回会终止进程,因为它大致等同于调用 exit。您有两个选择:

  1. 确保 main 不会 return 或以其他方式结束,直到所有工作完成,或者

  2. main 中调用 phthread_exit 而不是 returning。

理想情况下,您会将所有线程创建为可连接线程和一些关闭代码,这些代码仅在所有有用工作完成后运行,安排线程终止并连接它们。