最終更新日時(UTC):
が更新

履歴 編集

function
<rcu>

std::rcu_synchronize

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();
}

出力例

0 0
1 2
1 2

バージョン

言語

  • C++26

処理系

関連項目

参照