gpt4 book ai didi

c++ - ofstream 由多个线程共享 - 一段时间后崩溃

转载 作者:搜寻专家 更新时间:2023-10-31 01:10:51 27 4
gpt4 key购买 nike

此函数以 ofstream 作为引用,然后构建结构数据包,并将带有 ofstream 的结构线程化到 trie 匹配类。按照匹配距离的顺序返回一个堆栈,其中包含 n 个匹配项。然后将 ofstream、数据包和堆栈通过引用传递给打印函数,该函数将匹配项写入同一输出文件 - 等待不使用 ofstream 时。问题是在写入一半匹配后 ofstream 崩溃。

ofstream、数据包和输出文件头

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;
}

在多线程方面相当新颖,这些函数作为单线程运行良好。

是否应该将对可用流的检查放在分离出候选匹配项的 while 循环中?一旦 ofstream 可用,开始打印序列应该将 ofstream 与其他线程联系起来。

是否有更好的方法来保留对多个线程共享的 ofstream 的使用?

最佳答案

如果您是多线程的新手,那么让这成为您应该使用互斥锁的一个教训。

fstream 对象就是一个对象。您必须使用互斥锁来防止同时访问它。

如果您只是希望线程能够将信息写入文件,您可以传递文件名(作为 string)而不是 fstream。然后线程可以打开具有独占读/写访问权限的文件。这将使用本地 fstream 对象,并且锁定将由操作系统处理。

关于c++ - ofstream 由多个线程共享 - 一段时间后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15513549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com