Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Overhead меряли? Что с другими архитектурами?



Для гарантии можно использовать static_assert на std::atomic::is_always_lock_free.
https://en.cppreference.com/w/cpp/atomic/atomic/is_always_lock_free
const size_t BUFF_SZ = 10000;
vector<byte> buffer(BUFF_SZ);
size_t bufCPos = 0; // в каждом потоке свой буфер, поэтому без atomic
byte* popMem(size_t frameSz){
if (bufCPos + frameSz > BUFF_SZ){
return nullptr; // памяти не хватает - пропускаем кадр
}
bufCPos += frameSz;
return buffer.data() + (bufCPos - frameSz);
}
void pushMem(size_t frameSz){
bufCPos -= frameSz;
}
if (deallocated == (Leaf_Size_Bytes - available))
{ // everything that was allocated is now returned, we will try, carefully, reset the Leaf
if (leaf_array[head->leaf_id].available.compare_exchange_strong(available, Leaf_Size_Bytes))
{
leaf_array[head->leaf_id].deallocated -= deallocated;
}
}// тут все синхронизировались и узнают что было вычитание:
const int deallocated = leaf_array[head->leaf_id].deallocated.fetch_add(real_size, std::memory_order_acq_rel) + real_size;
int available = leaf_array[head->leaf_id].available.load(std::memory_order_acquire);
if (deallocated == (Leaf_Size_Bytes - available))
{ // everything that was allocated is now returned, we will try, carefully, reset the Leaf
if (leaf_array[head->leaf_id].available.compare_exchange_strong(available, Leaf_Size_Bytes))
{
// Это самая жёсткая синхронизация потому как "The default behavior of all atomic operations in the library provides for sequentially consistent ordering":
leaf_array[head->leaf_id].deallocated -= deallocated;
}
}
...
template<class T, class FAllocator = FastMemPoolNull >
struct FastMemPoolAllocator : public std::allocator<T>
...
std::unordered_map<int, int> umap2(1024, std::hash<int>(), std::equal_to<int>(), FastMemPoolAllocator<std::pair<const int, int>>());
C++ template аллокатора с потокобезопасным циклическим буфером