namespace std {
void make_hazard_pointer_batch(span<hazard_pointer> batch); // C++29
}
概要
複数のハザードポインタを、まとめて構築する。
batchに含まれる空のhazard_pointerオブジェクトそれぞれに、新しく構築したハザードポインタを所有させる。make_hazard_pointer()を個別に呼び出すよりも、複数のハザードポインタをまとめて構築することでレイテンシを低減できる。
効果
例外が送出された場合、何の効果も持たない (強い例外安全性の保証)。
そうでなければ、batchの各要素eのうちe.empty()がtrueであるものについて、ハザードポインタを構築し、eをそのハザードポインタの所有者にする。
戻り値
なし
例外
新しく構築するハザードポインタのいずれかのメモリを確保できなかった場合、std::bad_allocを送出する可能性がある。
備考
- 既に非空 (ハザードポインタを所有している) の要素は変更されない。
例
#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*> d0{new Data(1)};
std::atomic<Data*> d1{new Data(2)};
int main()
{
// 2つのハザードポインタをまとめて構築する (個別構築より低レイテンシ)
std::array<std::hazard_pointer, 2> hp;
std::make_hazard_pointer_batch(hp);
// それぞれで別の共有データを保護する
Data* p0 = hp[0].protect(d0);
Data* p1 = hp[1].protect(d1);
std::println("{} {}", p0->value, p1->value);
// まとめて破棄する
std::clear_hazard_pointer_batch(hp);
// 後始末: 共有データを回収予約する
d0.load()->retire();
d1.load()->retire();
}
出力
1 2
バージョン
言語
- C++29
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??
関連項目
参照
- P3428R4 Hazard Pointer Batches
- C++29で追加された