#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
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다