gpt4 book ai didi

c - Pthread_join Printf

转载 作者:行者123 更新时间:2023-11-30 16:47:14 25 4
gpt4 key购买 nike

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

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 在所有工作完成之前不会返回或结束,或者

  2. main 中调用 phthread_exit 而不是返回。

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

关于c - Pthread_join Printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43398690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com