#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行文本。这有什么问题以及如何修复?
答案 0 :(得分:3)
您的print
功能正在打开"argi.txt"
而不是filename
,即从来电者处收到的文件名。通过此更正,您的程序适合我。
补充说明:
您应该删除整个函数周围的互斥锁,因为它有效地序列化您的线程。如果没有并行执行的可能性,就会错过使用线程的整个过程。
在线程函数返回之前调用pthread_exit()
是不必要的,可以删除。
可以使用PTHREAD_MUTEX_INITIALIZER
宏初始化全局pthread互斥锁,在这种情况下,它们不需要调用pthread_mutex_init
和pthread_mutex_destroy
。
答案 1 :(得分:2)
显然file.open("argi.txt");
不正确,你没有名为“argi.txt”的文件。大概你的意思是file.open(filename);
while(file.is_open())
也有点奇怪,if (file.is_open())
更自然。
然而,不确定不可读文本的屏幕。据推测还有其他问题。