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