#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_init
и pthread_mutex_destroy
.
Очевидно file.open("argi.txt");
неверно, у вас нет файла под названием "argi.txt". Предположительно, вы имели в виду file.open(filename);
while(file.is_open())
тоже немного нечетно, if (file.is_open())
является более естественным.
Однако не уверен в экране нечитаемого текста. Предположительно, есть и другие проблемы.