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>;
}
概要
同じストリームへアトミックに出力するメカニズムを提供する。
エイリアス | 説明 | 対応バージョン |
---|---|---|
osyncstream |
basic_osyncstream<char> |
C++20 |
wosyncstream |
basic_osyncstream<wchar_t> |
C++20 |
メンバ
基底クラスである basic_ostream
も参照のこと。
メンバ関数
構築・破棄
名前 | 説明 | 対応バージョン |
---|---|---|
(constructor) |
コンストラクタ | C++20 |
(destructor) |
デストラクタ | C++20 |
割り当て
名前 | 説明 | 対応バージョン |
---|---|---|
operator= |
代入演算子 | C++20 |
その他メンバ関数
名前 | 説明 | 対応バージョン |
---|---|---|
emit |
ベースとなるbasic_syncbuf に対してemit() を呼び出す |
C++20 |
get_wrapped |
ベースとなるbasic_syncbuf に対してget_wrapped() を呼び出す |
C++20 |
rdbuf |
ベースとなるstd::basic_syncbuf へのポインタを返す |
C++20 |
メンバ型
名前 | 説明 | 対応バージョン |
---|---|---|
char_type |
charT |
C++20 |
traits_type |
Traits Traits::char_type がCharT でない場合、プログラムは不適格である |
C++20 |
int_type |
Traits::int_type |
C++20 |
pos_type |
Traits::pos_type |
C++20 |
off_type |
Traits::off_type |
C++20 |
allocator_type |
Allocator |
C++20 |
streambuf_type |
std::basic_streambuf<CharT, Traits> |
C++20 |
syncbuf_type |
std::basic_syncbuf<CharT, Traits, Allocator> |
C++20 |
例
#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();
}
xxxxxxxxxx
#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();
}
出力例
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();
}
xxxxxxxxxx
#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();
}
出力例
Hello, World!
aGoodbye, Planet!
バージョン
言語
- C++20
処理系
- Clang: ??
- GCC: 11.1 ✅
- Visual C++: 2019 update 10 ✅