c++ - 文件线程

标签 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 行文本。出了什么问题有了这个,如何解决?

最佳答案

您的 print 函数正在打开 "argi.txt" 而不是 filename,即从调用方收到的文件名。通过此更正,您的程序对我有用。

补充说明:

  • 您应该移除整个函数周围的互斥体,因为它有效地序列化了您的线程。没有并行执行的可能性,就失去了使用线程的全部意义。

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

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

关于c++ - 文件线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20326665/

相关文章:

c++ - 查找内存溢出

c++ - C++ 中的可变长度位集

C++ 编译器无法使用我的重载 < 运算符进行位集键比较

C++ I/O 在 EOF 后重新读取文件(原为 : Parsing a Comma Delimited Text File)

java - 将整数传递给线程

linux - ubuntu bash脚本备份/home/$user但保留最新的

windows - 远程执行时短 LdrLoadDll stub 崩溃

java - 如何在简单的现金存取程序中处理多线程

ubuntu - "sudo apt update",我得到的只是(目标内容配置多次),(存储库没有发布文件),(404未找到)

ubuntu - 无法通过公网 IP 访问 EC2 实例