此函数以 ofstream 作为引用,然后构建结构数据包并使用 ofstream 将结构从结构中线程化到一个匹配类。按照匹配距离的顺序返回一个包含 n 个匹配项的堆栈。然后,ofstream、数据包和堆栈通过引用传递给打印函数,该函数将匹配项写入同一输出文件 - 等待 ofstream 不使用时。问题是在写入一半匹配项后 ofstream 崩溃。
ofstream、packet 和 outfile 标头
void Match_Import_Start(Trie & tri)
{
stack<Trie::MatchesT> out;
ofstream myfile;
Trie::MatchesT matchSet;
myfile.open(outFile.c_str() );
myfile << "DESCRIPTION,SUGGESTED.DESCRIPTION,EDIT" << "\n"; //write header
myfile.close();
Match_Import (tri, myfile, out, matchSet);
return;
}
从记录列表中产生线程
void Match_Import(Trie &tri, ofstream &myfile, stack<Trie::MatchesT> out, Trie::MatchesT matchSet)
{
out=parse_CSV_file(timeFile); //read in records
settingT x;
x.score=0;
boost::thread_group tgroup; //http://stackoverflow.com/questions/8744279/create-threads-in-a-loop
while (!out.empty() ) {
matchSet=out.top();
out.pop();
tgroup.create_thread(boost::bind( MaxDistanceCorrections, boost::ref(tri), matchSet, boost::ref(myfile), boost::ref(x) ) );
}
tgroup.join_all();
return;
}
检查匹配的有效返回
void MaxDistanceCorrections(Trie & tri, Trie::MatchesT matchSet, ofstream &myfile, settingT &x)
{
if (!matchSet.candidateStack.empty() ) ) {
matchSet.candidateStack.sort(compareCorrMain);
PrintCorrections(tri, matchSet, myfile, x);
return;
} else {
tri.suggest(matchSet); //send out to trie match
if (matchSet.candidateStack.empty() ) { }// modify match parameters
MaxDistanceCorrections(tri, matchSet, myfile, x);
}
}
并在 ofstream 可用时打印
void PrintCorrections(Trie &tri, Trie::MatchesT &matchSet, ofstream &myfile, settingT &x)
{
while (true) {
if (!myfile.is_open() ) {
myfile.open(outFile.c_str(), ios::out | ios::app);
break;
}
}
while (!matchSet.candidateStack.empty() ) {
Trie::CorrectionT corr=matchSet.candidateStack.back();
matchSet.candidateStack.pop_back();
const bool flagGood=scoreSuggest (corr); //score
if (flagGood ) x.score++;
myfile << matchSet.testCase << "," << corr.match << "," << corr.editDistance << "\n";
}
myfile.close();
return;
}
在多线程方面相当新,这些函数作为单线程工作得很好。
是否应该将检查 ofstream 可用放在衍生候选匹配的 while 循环中?一旦 ofstream 可用,则启动打印序列应将 ofstream 与其他线程绑定。
有没有更好的方法来保留由多个线程共享的 ofstream 的使用?