Потоки с файлами

0
#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 строк текста. Что не так с этим и как можно исправить?

Теги:
multithreading

2 ответа

3
Лучший ответ

Функция print открывает "argi.txt" вместо имени filename, имя файла, полученное от вызывающего. С этой коррекцией ваша программа работает для меня.

Дополнительные замечания:

  • Вы должны удалить мьютекс вокруг всей функции, поскольку она эффективно сериализует ваши потоки. Без возможности параллельного выполнения вся точка использования потоков пропущена.

  • Вызов pthread_exit() перед тем, как функция потока возвращается в любом случае, не требуется и может быть удалена.

  • Глобальные мьютексы pthread могут быть инициализированы макросом PTHREAD_MUTEX_INITIALIZER, и в этом случае они не требуют вызова pthread_mutex_init и pthread_mutex_destroy.

2

Очевидно file.open("argi.txt"); неверно, у вас нет файла под названием "argi.txt". Предположительно, вы имели в виду file.open(filename);

while(file.is_open()) тоже немного нечетно, if (file.is_open()) является более естественным.

Однако не уверен в экране нечитаемого текста. Предположительно, есть и другие проблемы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню