namespace std {
void clear_hazard_pointer_batch(span<hazard_pointer> batch) noexcept; // C++29
}
概要
複数のハザードポインタを、まとめて破棄する。
batchに含まれる非空のhazard_pointerオブジェクトそれぞれが所有するハザードポインタを破棄し、その要素を空にする。個別に破棄するよりも、複数のハザードポインタをまとめて破棄することでレイテンシを低減できる。
make_hazard_pointer_batch()で構築したハザードポインタ群をまとめて破棄する用途に使用する。
効果
batchの各要素eについて、e.empty()がfalseであるものは、eが所有するハザードポインタを破棄し、eを空にする。
破棄されたハザードポインタが保護していたオブジェクトは、他に保護しているハザードポインタがなければ回収可能となる。
戻り値
なし
例外
投げない
備考
- 既に空の要素は変更されない。
例
#include <hazard_pointer>
#include <array>
#include <atomic>
#include <print>
struct Data : std::hazard_pointer_obj_base<Data> {
int value;
explicit Data(int v) : value(v) {}
};
std::atomic<Data*> data{new Data(42)};
int main()
{
// ハザードポインタ群をまとめて構築する
std::array<std::hazard_pointer, 2> hp;
std::make_hazard_pointer_batch(hp);
Data* p = hp[0].protect(data);
std::println("{}", p->value);
// 使い終わったハザードポインタ群をまとめて破棄する
std::clear_hazard_pointer_batch(hp);
// 後始末: 共有データを回収予約する
data.load()->retire();
}
出力
42
バージョン
言語
- C++29
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??
関連項目
参照
- P3428R4 Hazard Pointer Batches
- C++29で追加された