Pthread_join Printf

时间:2017-04-13 17:48:56

标签: c multithreading pthread-join

我有这个问题,我正在学习,但我不理解一部分。该脚本不是英文的,因此翻译会相当繁琐,但基本问题是让线程读取特定的文本文件并找到特定的单词。每个文件都有自己的线程和所有这些。最后两个问题是确保同一文件上的各种事件一起打印,如:

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

等等。我可以使用全局2d数组解决这个问题并创建一个结构,将其“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

1 个答案:

答案 0 :(得分:0)

main返回会终止该过程,因为它大致相当于调用exit。你有两个选择:

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

  2. phthread_exit中呼叫main而非返回。

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