- syncstream[meta header]
- std[meta namespace]
- class template[meta id-type]
- cpp20[meta cpp]
namespace std {
template<class charT, class traits, class Allocator>
class basic_osyncstream : public basic_ostream<charT, traits> { ... };
using osyncstream = basic_osyncstream<char>;
using wosyncstream = basic_osyncstream<wchar_t>;
}
- basic_ostream[link ../ostream/basic_ostream.md]
同じストリームへアトミックに出力するメカニズムを提供する。
エイリアス |
説明 |
対応バージョン |
osyncstream |
basic_osyncstream<char> |
C++20 |
wosyncstream |
basic_osyncstream<wchar_t> |
C++20 |
基底クラスである basic_ostream
も参照のこと。
#include <iostream>
#include <syncstream>
#include <thread>
void thread1()
{
{
std::osyncstream bout{std::cout};
bout << "Hello, ";
bout << "World!";
bout << std::endl; // フラッシュがノートされる
bout << "and more!\n";
} // 文字が転送され、cout はフラッシュする
}
void thread2()
{
// 同じバッファに行われる出力は、異なる std::basic_osyncstream(std::basic_syncbuf) の
// インスタンスからでも、アトミックに出力されることが保証される
std::osyncstream(std::cout) << "Goodbye, " << "Planet!" << '\n';
}
int main()
{
std::thread th1(thread1);
std::thread th2(thread2);
th1.join();
th2.join();
}
- osyncstream[color ff0000]
thread1 の処理が先行した場合。ただし、各出力は連続したシーケンスとなるように、アトミックに行われることが保証される。
Hello, World!
and more!
Goodbye, Planet!
std::basic_osyncstream
のオブジェクトはストリーム出力をアトミックにしたいスレッド毎に持つ必要がある。1つのstd::basic_osyncstream
のオブジェクトを複数のスレッドで共有して使用してしまうと、出力は競合する。
#include <iostream>
#include <syncstream>
#include <thread>
// 1つのosyncstreamを複数スレッドで共有してしまうと出力の競合が起こる
std::osyncstream bout{std::cout};
void thread1()
{
{
bout << "Hello, ";
bout << "World!";
bout << std::endl;
bout << "and more!\n";
}
}
void thread2()
{
bout << "Goodbye, " << "Planet!" << '\n';
}
int main()
{
std::thread th1(thread1);
std::thread th2(thread2);
th1.join();
th2.join();
}
- osyncstream[color ff0000]
Hello, World!
aGoodbye, Planet!