在函数调用结束时,boost filter_ostream达到竞争条件

时间:2018-07-17 19:09:07

标签: c++ boost

虽然使用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开发者都应将此作为调试竞态条件的测试用例。

0 个答案:

没有答案