namespace std {
void rcu_synchronize(rcu_domain& dom = rcu_default_domain()) noexcept;
}
概要
RCUドメインのアンロック完了を待機する。
効果
もしrcu_synchronize
呼び出しがdom
上のRCU保護区間R
のロックを開く操作よりも確実に前に発生するのでなければ、R
を閉じるunlock
まで現スレッドをブロックする。
同期操作
R
を閉じるunlock
は、rcu_synchronize
からの戻りよりも確実に前に発生する。
戻り値
なし
例外
投げない
備考
rcu_synchronize
呼び出しは、暗黙にrcu_barrier
を呼ばない。
例
#include <atomic>
#include <mutex>
#include <thread>
#include <rcu>
struct Data {
int m1, m2;
};
// 共有データを指すポインタ
std::atomic<Data*> data;
void reader()
{
std::scoped_lock slk{std::rcu_default_domain()};
// 共有データを読み取り(Read)
Data *p = data;
std::println("{} {}", p->m1, p->m2);
}
void updater()
{
Data *newdata = new Data{1, 2};
// 新しいデータで共有データを更新(Update)
Data *old_data = data.exchange(newdata);
// 古いデータを読み取り中のスレッドがなくるまで待機する
std::rcu_synchronize();
delete old_data;
}
int main()
{
// 共有データ初期化
Data *newdata = new Data{0, 0};
data.store(newdata);
// 共有データへ並行アクセス
std::jthread th{[] {
for (int i = 0; i < 3; i++) {
reader();
}
}};
updater();
}
47
#include <atomic>
#include <mutex>
#include <thread>
#include <rcu>
struct Data {
int m1, m2;
};
// 共有データを指すポインタ
std::atomic<Data*> data;
void reader()
{
std::scoped_lock slk{std::rcu_default_domain()};
// 共有データを読み取り(Read)
Data *p = data;
出力例
0 0
1 2
1 2
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??