簡體   English   中英

在boost iostream filtering_ostream中,sync(),strict_sync()和flush()之間有什么區別?

[英]in boost iostream filtering_ostream, what is the difference between sync(), strict_sync() and flush()?

考慮簡單的計數過濾器:

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(); //與此調用有什么不同count_cout.strict_sync(); //給這個電話count_cout.flush(); //給這個電話?

我正在使用boost 1.50.0

syncstrict_syncflush之間的關鍵區別在於它們的返回值。 所有3個。 所有這些都在任何Filter或Device上調用flush方法,該filter或Device是滿足Flushable概念的filtering_stream的一部分。 簡單地跳過任何不支持Flushable概念的過濾器/設備。

除非其中一個可刷新的過濾器/設備返回false,否則sync將返回true。 這意味着如果有不可刷新的過濾器/設備屬於filtering_stream ,數據可能會卡在其中,但sync將返回true,因為它們不是Flushable。

strict_sync類似,除非它遇到不可刷新的過濾器/設備。 在這種情況下,即使所有可strict_sync的過濾器/設備都可能返回true, strict_sync也將返回false。 這樣做的原因是strict_sync的調用者知道如果它返回true,則所有數據都被成功刷新。

成員flush只返回對流的引用,有效地丟棄刷新是否成功。 非成員flush 具有它自己的規則,它根據輸入值返回它

在您的情況下, CountableOstreamFilter不可刷新(它不能轉換為必需的flushable_tag)。 因此,只要底層流上的刷新成功,對sync調用就會返回true。 但是, strict_sync應該返回false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM