线程化文件

时间:2013-12-02 11:01:11

标签: c++ multithreading ubuntu

#include<pthread.h>
    #include<iostream>
    #include<fstream>
    #include<sstream>
    #include<vector>
    #include<algorithm>

    using namespace std;
    pthread_t threads[10];
    pthread_mutex_t mut;

    void *print(void *fname){
            char *filename=(char*)fname;
            ifstream file;
            vector<string> lines;
            file.open("argi.txt");
            pthread_mutex_lock(&mut);

            while(file.is_open()){
                    string line;
                    while(getline(file,line)){
                            lines.push_back(line);
                    }
            file.close();
            }
            int i;

                for(i=lines.size()-1;i>=0;i--)            
                cout<<lines[i]<<endl;

            pthread_mutex_unlock(&mut);
            pthread_exit(NULL);
            return NULL;
    }


    int main(int argc, char** argv){

            pthread_mutex_init(&mut,NULL);
            for(int i=1;i<argc;i++){

                    pthread_create(&threads[i],NULL,print,(void*)argv[i]);
            }
            for(int i=1;i<argc;i++)
                    pthread_join(threads[i],NULL);
            pthread_mutex_destroy(&mut);

            return 0;}

现在这应该采用n个文件名,对于每个文件,将创建一个线程,并以相反的顺序显示文件的行。 ./a.out arg1.txt arg2.txt是我正在使用的命令,我得到的是一个不可读字符的屏幕。存在2个文件,每个文件有5行文本。这有什么问题以及如何修复?

2 个答案:

答案 0 :(得分:3)

您的print功能正在打开"argi.txt"而不是filename,即从来电者处收到的文件名。通过此更正,您的程序适合我。

补充说明:

  • 您应该删除整个函数周围的互斥锁,因为它有效地序列化您的线程。如果没有并行执行的可能性,就会错过使用线程的整个过程。

  • 在线程函数返回之前调用pthread_exit()是不必要的,可以删除。

  • 可以使用PTHREAD_MUTEX_INITIALIZER宏初始化全局pthread互斥锁,在这种情况下,它们不需要调用pthread_mutex_initpthread_mutex_destroy

答案 1 :(得分:2)

显然file.open("argi.txt");不正确,你没有名为“argi.txt”的文件。大概你的意思是file.open(filename);

while(file.is_open())也有点奇怪,if (file.is_open())更自然。

然而,不确定不可读文本的屏幕。据推测还有其他问题。