複数のプロセスがあり、すべて同じ出力ストリームに書き込みます (例: std::cout
)。ストリームをロックして、プロセスが独自のメッセージの書き込みを開始したときに、最後までそれを実行できるようにする方法はありますか (例: std::endl
)?
ポータブルな方法が必要です。
状況のパラメーターに適合するかどうかは明らかではありませんが、すべてのデータを、データを (独自の内部ロックを使用して) 集約する別のワーカー プロセスに送ってから、標準出力にダンプする可能性があります。
あなたは運が悪いです。ターゲット OS が提供するものは何でも使用する必要があります。これは、グローバル/システム全体のミューテックスまたはlockf()
同様の機能を使用することを意味します。Boost.Interprocessなどのサードパーティのライブラリを使用して、移植性の要件を満たすことができます。
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 実装に依存します。