• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function template
    <rcu>

    std::rcu_retire

    namespace std{
      template<class T, class D = default_delete<T>>
      void rcu_retire(T* p,
                      D d = D(),
                      rcu_domain& dom = rcu_default_domain());
    }
    

    概要

    RCU機構により保護されるオブジェクト回収をスケジュールする。

    適格要件

    is_move_constructible_v<D> == true、かつ式d(p)が妥当であること。

    事前条件

    DはCpp17MoveCosntructible要件およびCpp17Destructible要件をみたすこと。

    効果

    • メモリを確保する可能性がある。
      • メモリ確保がoperator newを呼び出すか否かは未規定である。
    • D型のオブジェクトd1std::move(d)で初期化する。
    • RCUドメインdomに対して式d1(p)の評価をスケジュールする。
    • domに対してスケジュールされた評価を呼び出す可能性がある。

    戻り値

    なし

    例外

    bad_alloc、またはd1初期化中に送出された例外

    #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_retire(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

    処理系

    関連項目

    参照