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
。您有两个选择:
确保 main 不会 return 或以其他方式结束,直到所有工作完成,或者
在 main
中调用 phthread_exit
而不是 returning。
理想情况下,您会将所有线程创建为可连接线程和一些关闭代码,这些代码仅在所有有用工作完成后运行,安排线程终止并连接它们。
我正在研究这个问题,但我不理解其中的一部分。该脚本不是英文的,因此翻译起来会很乏味,但基本问题是让线程读取特定的文本文件并找到特定的单词。每个文件都有自己的线程等等。最后 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
。您有两个选择:
确保 main 不会 return 或以其他方式结束,直到所有工作完成,或者
在
main
中调用phthread_exit
而不是 returning。
理想情况下,您会将所有线程创建为可连接线程和一些关闭代码,这些代码仅在所有有用工作完成后运行,安排线程终止并连接它们。