【问题标题】:Reading same file with ifstream by multiple threads (pthread)通过多个线程(pthread)使用 ifstream 读取相同的文件
【发布时间】:2015-11-04 16:37:44
【问题描述】:

我有一个函数,它由我的程序中创建的多个线程同时执行,并且递归地创建更多线程来再次执行相同的函数。我必须在这个函数中处理一个大文件。由于会有多个线程处理同一个文件,我想我必须为每个线程寻找文件的开头。这会将其他文件流也移动到文件的开头吗?会不会有什么问题?

void *myFunc(){
    string lin;
    ifstream ifs ("input.txt");
    if(ifs){
        ifs.seekg(0,ifs.beg);
        while(getline(ifs,lin)){
            ...
            do something
            ...
        }
        ifs.close();
    }
    pthread_t ptds[100];
    int cc = 0;
    if(some condition based on the above code){
        for(int i=0;i<100;i++){
            int rc = pthread_create(&ptds[cc++], NULL, myFunc, NULL);
            if (rc){
                cout << "Error:unable to create thread," << rc << endl;
                exit(-1);
            }
            else{
                cout << "Thread created" << endl;
            }
        }
        void* status;
        int rc;
        for(int i=0; i < 100; i++ ){
            rc = pthread_join(ptds[i], &status);
            if (rc){
                cout << "Error:unable to join," << rc << endl;
                exit(-1);
            }
        }
    }
}

我得到了一些模棱两可的结果。每次运行代码时结果都会发生变化。我假设这与文件 I/O 同步有关。如何解决?

【问题讨论】:

    标签: c++ multithreading file-io pthreads ifstream


    【解决方案1】:

    如果您尝试在多个线程中读取同一个文件对象,它们会破坏彼此的状态。我建议将文件读入内存一次(或对其进行内存映射),然后让每个线程从内存中读取数据,这样他们就可以免等待。

    【讨论】:

    • 文件太大,无法存储在内存中。
    • @Ojas 除非它在 ​​32 位系统上大于 2GiB,否则内存映射应该仍然有效。
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2020-09-05
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多