最終更新日時: 2025年07月09日 17時52分14秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<rcu>

# std::rcu_synchronize(C++26)

    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 jt{[] {
        for (int i = 0; i < 3; i++) {
          reader();
        }
      }};
      updater();
    }

### 出力例

    0 0
    1 2
    1 2

## バージョン

### 言語

- C++26

### 処理系

- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??

## 関連項目

- `rcu_domain`

## 参照

- P2545R4 Read-Copy Update(RCU)