【问题标题】:Pthread_join Printfpthread_join printf
【发布时间】:2017-09-09 22:55:27
【问题描述】:

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

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

【问题讨论】:

  • 在我们看不到的代码中找不到错误。但是您可以使用其他一些同步机制(例如互斥锁、条件变量和谓词变量)来了解工作何时完成。
  • 我想我明白发生了什么,它不是错误。如果线程不可连接,我将丢失线程函数中更改的信息?
  • 不,事情根本不是这样的。您只需要确保在尝试使用其结果之前完成工作。 (并且使用终止线程来指示工作何时完成是一种不好的做法。)
  • 建议使用pthread_join()
  • 使用终止线程来了解工作已经完成是一种不好的做法。没有理由想要等到工作完成的代码应该关心完成工作的线程在完成工作后继续做什么。如果您想等到工作完成,请等待工作。也许有人建议您确保了解 pthread_join 的工作原理。

标签: c multithreading pthread-join


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-20
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2016-09-17
    • 2018-11-06
    • 2010-09-09
    相关资源
    最近更新 更多