C Pthread_join Printf

C Pthread_join Printf,c,multithreading,pthread-join,C,Multithreading,Pthread Join,我有这个问题,我正在研究,但我不理解其中的一部分。脚本不是英文的,所以翻译会非常乏味,但基本问题是让线程读取特定的文本文件并找到特定的单词。每个文件都有自己的线程和所有这些。最后两个问题是确保同一文件上的各种引用一起打印,如: file1: line 1 file1: line 2 file2: line 1 等等。我可以使用一个全局2d数组来解决这个问题,并创建一个结构来传递给线程它的“id”和它必须搜索的txt文件的名称。我使用了pthread\u join,它非常直观。问题在下一个问题中

我有这个问题,我正在研究,但我不理解其中的一部分。脚本不是英文的,所以翻译会非常乏味,但基本问题是让线程读取特定的文本文件并找到特定的单词。每个文件都有自己的线程和所有这些。最后两个问题是确保同一文件上的各种引用一起打印,如:

file1: line 1
file1: line 2
file2: line 1
等等。我可以使用一个全局2d数组来解决这个问题,并创建一个结构来传递给线程它的“id”和它必须搜索的txt文件的名称。我使用了
pthread\u join
,它非常直观。问题在下一个问题中,请解决相同的问题,但不使用
pthread\u join
,如果可能,也不需要忙等待。问题是,如果我不使用
pthread\u join
,我就无法在线程函数上打印任何内容,这是我没有料到的?这有什么原因吗

这是我用来解决
pthread\u join
问题的代码。如果没有
pthread\u 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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义k4
#定义L100
int match_行(int fd,char*str);
void*ocorre(void*);
字符串[100];
int b[k][l];
int max;
结构参数{
char-str[256];
int-id;
};
int main(int argc,char*argv[]){
int i=0;
int j=0;
max=argc-1;
结构参数参数[max];
pthread_t a[max];
strcpy(字符串,argv[1]);//全局

对于(i=0;i从
main
返回将终止进程,因为它大致相当于调用
exit
。您有两种选择:

  • 确保在所有工作完成之前,main不会返回或以其他方式结束,或者

  • main
    中调用
    phthread\u exit
    ,而不是返回


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

    我们在代码中找不到我们看不到的错误。但您可以使用其他一些同步机制(如互斥体、条件变量和谓词变量)要知道工作何时完成。我想我了解发生了什么,这不是一个bug。如果线程不可连接,我将丢失在线程函数中更改的信息?不,这根本不是工作方式。在尝试使用其结果之前,您只需确保工作已完成。(并且使用线程终止来指示何时完成工作是一种糟糕的做法。)建议使用pthread_join()使用线程的终止作为知道工作已完成的一种方式是一种不好的做法。没有理由认为希望等待工作完成的代码应该关心完成工作的线程在完成工作后继续做什么。如果希望等待工作完成,请等待工作。可能有人建议m确保您了解了
    pthread\u join
    的工作原理。