我的程序讀入兩個輸入文件並交替將行寫入輸出文件。我有它,所以它按正確的順序寫入(第一個文件,然後第二個,然後再一次,....),但問題是它在每個文件中最後兩次寫入最後一個字符。讀取兩個文件並使用線程輸出到另一個文件
#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
using namespace std;
mutex mtx;
int turn = 1;
void print_line(ifstream * in_stream, ofstream * out_stream, int t);
int main(int argc, const char * argv[]){
ifstream input_file_1;
ifstream input_file_2;
ofstream output_file;
input_file_1.open("input_1");
input_file_2.open("input_2");
output_file.open("output");
if (input_file_1.fail() || input_file_2.fail() || output_file.fail()) {
cout << "Error while opening the input files\n";
exit(EXIT_FAILURE);
}
else{
thread input1 (print_line, &input_file_1, &output_file, 1);
thread input2 (print_line, &input_file_2, &output_file, 2);
input1.join();
input2.join();
}
input_file_1.close();
input_file_2.close();
output_file.close();
return 0;
}
void print_line(ifstream * in_stream, ofstream * out_stream, int t){
char temp;
while (!in_stream->eof()) {
mtx.lock();
if (turn == t) {
*in_stream>>temp;
*out_stream<<temp;
if (turn == 1) {
turn = 2;
}
else{
turn = 1;
}
}
mtx.unlock();
}
}
輸入1
a
c
e
輸入2
b
d
f
輸出
abcdefef
我不知道爲什麼它再次寫入的最後一個字符,也就是有一個更好的方法來使用線程來完成排序部分,I瞭解互斥鎖用於確保兩個線程不會同時寫入,但是如何確保線程在線程2之前執行並確保其保持交替?
感謝
解決了閱讀額外字符的問題,但是現在我並不總是得到abcdef,有時會讓它們失序或者只是輸入1的第一個字母。之前當我擁有它時,我一直以其他方式獲得abcdefef 。任何線索爲什麼? –
@GregBrown查看我提出的解決方案的更新答案。 – Snps
非常感謝你的回答,一切都很好,你是否介意擴大cv.wait(lock,[&t] {return turn == t;});我知道使用[&t] {return turn == t; }在他們的論點。 –