1

複数のプロセスがあり、すべて同じ出力ストリームに書き込みます (例: std::cout)。ストリームをロックして、プロセスが独自のメッセージの書き込みを開始したときに、最後までそれを実行できるようにする方法はありますか (例: std::endl)?

ポータブルな方法が必要です。

4

3 に答える 3

2

状況のパラメーターに適合するかどうかは明らかではありませんが、すべてのデータを、データを (独自の内部ロックを使用して) 集約する別のワーカー プロセスに送ってから、標準出力にダンプする可能性があります。

于 2012-07-01T12:41:30.513 に答える
2

あなたは運が悪いです。ターゲット OS が提供するものは何でも使用する必要があります。これは、グローバル/システム全体のミューテックスまたはlockf()同様の機能を使用することを意味します。Boost.Interprocessなどのサードパーティのライブラリを使用して、移植性の要件を満たすことができます。

于 2012-06-30T18:29:10.947 に答える
1

UNIX のような OS を使用している場合は、アダプターを使用して必要な動作を模倣できる場合がありますstringstream。これは最適な方法ではないかもしれませんが、 が発生するwriteたびに 1 つの呼び出しをトリガーするという考え方ですstd::endl

// Assume fd is in blocking mode
class fdostream : public std::ostringstream {
    typedef std::ostream & (*manip_t) (std::ostream &);
    struct fdbuf : public std::stringbuf {
        int fd_;
        fdbuf (int fd) : fd_(fd) {}
        int sync () {
            int r = ::write(fd_, str().data(), str().size());
            str(std::string());
            return (r > 0) ? 0 : -1;
        } 
    } buf_;
    std::ostream & os () { return *this; }
public:
    fdostream (int fd) : buf_(fd) { os().rdbuf(&buf_); }
};

fdostream my_cout(1);
my_cout << "Hello," << " world!" << std::endl;

これにより、同期書き込みの効果が得られますが、入力を a にバッファリングし、各フラッシュ後stringstreamに内部をクリアする必要があります。string

移植性を高めるために、コードを変更して を使用しfwrite、バッファなしの書き込みを で指定できますsetvbuf。ただし、の原子性はfwrite、ライブラリ関数の C 実装に依存します。

于 2012-06-30T21:12:05.487 に答える