在boost iostream filtering_ostream中,sync(),strict_sync()和flush()之间有什么区别?

时间:2013-02-28 18:40:23

标签: c++ boost iostream boost-iostreams

考虑一个简单的计数过滤器:

class CountableOstreamFilter : public boost::iostreams::multichar_output_filter {
public:
    CountableOstreamFilter(): m_written(0) { 
    }

    template<typename Sink>
    std::streamsize write(Sink& dest, const char* s, std::streamsize n)
    {
            auto result  = boost::iostreams::write(dest, s, n);
            assert(n == result);
            m_written += result;
            return result;
    }

    inline std::streamsize writtenBytes() const {
        return m_written;
    }

private:
    std::streamsize m_written;
};

并使用它:

boost::iostreams::filtering_ostream counted_cout;
counted_cout.push(CountableOstreamFilter());
counted_cout.push(std::cout);
counted_cout << "hello world";

调用sync(),strict_sync()或flush()会有什么区别?     counted_cout.sync(); //与此次通话有何不同     counted_cout.strict_sync(); //给这个电话     counted_cout.flush(); //给这个电话?

我正在使用boost 1.50.0

1 个答案:

答案 0 :(得分:3)

syncstrict_syncflush之间的主要区别在于它们的返回值。所有3个。所有这些都在满足Flushable概念的filtering_stream的任何过滤器或设备上调用flush方法。简单地跳过任何不支持Flushable概念的过滤器/设备。

除非其中一个Flushable Filters / Devices返回false,否则

sync将返回true。这意味着如果存在属于filtering_stream的非可刷新过滤器/设备,则数据可能会卡在其中,但sync将返回true,因为它们不是可刷新的。

strict_sync类似,除非它遇到不可刷新的过滤器/设备。在这种情况下,strict_sync将返回false,即使所有可刷新的过滤器/设备都可能返回true。这样做的原因是strict_sync的调用者知道如果它返回true,则所有数据都被成功刷新。

成员flush只返回对流的引用,有效地丢弃刷新是否成功。非会员flush has it's own rules for what it returns depending on the input value

在您的情况下,CountableOstreamFilter不可刷新(它不能转换为必需的flushable_tag)。因此,只要底层流上的刷新成功,对sync的调用将返回true。但是,strict_sync应返回false。