虽然使用boost boost_filtering_stream和gzip,但我还是陷入了竞争状态,不确定这是通用的还是仅对我的boost版本1.63.0有用。我在ubuntu上使用gcc 7.3.0。认为这篇文章可能会帮助其他人遇到同样的麻烦。
我已经确认所有其他功能都可以正常工作。
这是我的缩写代码设置
这是一个类定义文件fool.cpp。为了清楚起见,没有显示异常处理代码。
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/gzip.hpp>
namespace bio=boost::iostreams;
...
void CLASSNAME::cook(const string& fq1, const string& fq2, const array<string,3>& outq, const string& logfile) {
bio::filtering_istream ins1, ins2;
ifstream inf1(fq1, std::ios_base::in | std::ios::binary);
ifstream inf2(fq2, std::ios_base::in | std::ios::binary);
ins1.push(bio::gzip_decompressor());
ins1.push(inf1);
ins2.push(bio::gzip_decompressor());
ins2.push(inf2);
ofstream outf1, outf2, outf3;
outf1.open(outq[0], std::ios_base::binary);
outf2.open(outq[1], std::ios_base::binary);
outf3.open(outq[2], std::ios_base::binary); bio::filtering_ostream ous1, ous2, ous3;
ous1.push(bio::gzip_compressor()); ous1.push(outf1);
ous2.push(bio::gzip_compressor()); ous2.push(outf2);
ous3.push(bio::gzip_compressor()); ous3.push(outf3);
while (read(ins1) && read(ins2)) {
ous1 << "some data";
ous2 << "more data";
ous3 << "bar data";
repeated millions times
}
// If the following lines are removed then the race
// condition goes away
ofstrream log(logfile);
log << "write some log data"
}
如果我删除日志文件写入部分,则竞争条件消失了。不确定我的代码是否有任何逻辑错误。但是请发表评论。这段代码会将结果写入3个文件中。您可以从前两个输出文件中永久读取该程序,但不能从第三个输出文件中读取。我添加了表明该功能卡在该功能末尾的调试代码。如果在调试器中运行,它将卡在boost库中。 iostream部分的任何boost开发者都应将此作为调试竞态条件的测试用例。