nlib
nn::nlib::LockFreeUnitHeap クラスfinal

固定メモリサイズの領域を確保・解放をロックフリーで行うことのできるプールアロケータです。 [詳解]

#include "nn/nlib/LockFree.h"

公開メンバ関数

 LockFreeUnitHeap () noexcept
 デフォルトコンストラクタです。
 
errno_t Init (size_t unit_size, size_t align, size_t count) noexcept
 アロケータを初期化します。スレッドセーフではありません。 [詳解]
 
 ~LockFreeUnitHeap () noexcept
 デストラクタです。
 
MemHolder * Alloc () noexcept
 メモリを割り当てます。スレッドセーフです。 [詳解]
 
void Free (MemHolder *p) noexcept
 メモリを解放します。スレッドセーフです。 [詳解]
 
MemHolder * AllocUnsafe () noexcept
 Alloc()と同様ですが、スレッドセーフではありません。 [詳解]
 
void FreeUnsafe (MemHolder *p) noexcept
 Free()と同様ですが、スレッドセーフではありません。 [詳解]
 
void SwapUnsafe (LockFreeUnitHeap &rhs) noexcept
 オブジェクトをスワップします。スレッドセーフではありません。
 

詳解

固定メモリサイズの領域を確保・解放をロックフリーで行うことのできるプールアロケータです。

説明
通常、malloc(), free()等は内部でスレッドがブロックされる可能性がありますが、LockFreeUnitHeapはブロックする可能性なしにメモリの取得、解放を行うことができます。 スレッドがブロックされることが容認できない場合や、サイズが同一で比較的大きいサイズのメモリを動的に取得、解放したい場合にこのクラスの利用を検討するとよいでしょう。
コード例
// Can allocate 32 bytes aligned, 1024 memory blocks from heap
e = heap.Init(sizeof(MyStructure), 32, 1024);
if (nlib_is_error(e)) {
// ERROR
}
.....
p = heap.Alloc();
if (!p) {
// ERROR
}
// Note that p is not what you want. p->Get() is it.
MyStructure* s = reinterpret_cast<MyStructure*>(p->Get());
.....
heap.Free(p);

LockFree.h812 行目に定義があります。

関数詳解

◆ Alloc()

nn::nlib::LockFreeUnitHeap::Alloc ( )
inlinenoexcept

メモリを割り当てます。スレッドセーフです。

戻り値
割り当てが成功した場合はNULL以外のポインタ
説明
戻り値の型(MemHolder)はこのクラスの内部クラスで、Get()メンバ関数だけが利用できるクラスです。 返されたオブジェクトへのポインタに対してGet()を実行して戻り値を取得することで割り当てた領域を得ることができます。

LockFree.h830 行目に定義があります。

◆ AllocUnsafe()

nn::nlib::LockFreeUnitHeap::AllocUnsafe ( )
inlinenoexcept

Alloc()と同様ですが、スレッドセーフではありません。

戻り値
割り当てが成功した場合はNULL以外のポインタ

LockFree.h841 行目に定義があります。

◆ Free()

nn::nlib::LockFreeUnitHeap::Free ( MemHolder *  p)
inlinenoexcept

メモリを解放します。スレッドセーフです。

引数
[in]pAlloc()の戻り値

LockFree.h834 行目に定義があります。

◆ FreeUnsafe()

nn::nlib::LockFreeUnitHeap::FreeUnsafe ( MemHolder *  p)
inlinenoexcept

Free()と同様ですが、スレッドセーフではありません。

引数
[in]pAlloc()の戻り値

LockFree.h845 行目に定義があります。

◆ Init()

nn::nlib::LockFreeUnitHeap::Init ( size_t  unit_size,
size_t  align,
size_t  count 
)
noexcept

アロケータを初期化します。スレッドセーフではありません。

引数
[in]unit_size確保したい領域の1つあたりのサイズ
[in]align確保したい領域のアライメント
[in]count割り当てることのできる領域数の最大値
戻り値
0成功した場合
ENOMEMメモリの確保に失敗した場合
EINVALアライメントが2のべき乗ではなかった場合

このクラス詳解は次のファイルから抽出されました: