我有这个问题,我正在学习,但我不理解一部分。该脚本不是英文的,因此翻译会相当繁琐,但基本问题是让线程读取特定的文本文件并找到特定的单词。每个文件都有自己的线程和所有这些。最后两个问题是确保同一文件上的各种事件一起打印,如:
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;
}
答案 0 :(得分:0)
从main
返回会终止该过程,因为它大致相当于调用exit
。你有两个选择:
确保main不会返回或以其他方式结束,直到所有工作完成,或
在phthread_exit
中呼叫main
而非返回。
理想情况下,您可以将所有线程创建为可连接和一些关闭代码,这些代码仅在完成所有有用工作后运行,安排线程终止并加入它们。