目录
- 1.设计&结构
- 2.申请内存
- 3.释放内存
- 4.框架
1.设计&结构
-  Thread Cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表 
-  每个线程都会有一个Thread Cache对象,这样每个线程在这里获取对象和释放对象时是无锁的 
  
-  TLS – Thread Local Strorage - Linux gcc下TLS
- Windows vs下TLS
 
2.申请内存
- 当内存申请size<=256KB,先获取到线程本地存储的Thread Cache对象,计算size映射到哈希桶自由链表下标i
- 如果自由链表_freeLists[i]中有对象,则直接Pop一个内存对象返回
- 如果_freeLists[i]中没有对象时,则批量从Central Cache中获取一定数量的对象,插入到自由链表并返回一个对象
3.释放内存
- 当释放内存小于256k时将内存释放回Thread Cache,计算size映射自由链表桶位置i,将对象Push 到_freeLists[i]
- 当链表的长度过长,则回收一部分内存对象到central cache
4.框架
class ThreadCache
{
public:
    // 申请和释放内存/对象
    void *Allocate(size_t size);
    void Deallocate(void *ptr, size_t size);
    // 从CentralCache获取内存/对象
    void *FetchFromCentralCache(size_t index, size_t alignSize);
    // 释放对象时,链表过长,回收内存回到Central Cache
    void ListTooLong(FreeList &list, size_t size);
private:
    FreeList _freeLists[NFREELIST];
};
// 实现无锁访问 -- TLS
// 通过TLS,每个线程无锁地获取自己专属的ThreadCache对象
static _declspec(thread) ThreadCache *pTLSThreadCache = nullptr;














![[米联客-XILINX-H3_CZ08_7100] FPGA程序设计基础实验连载-37 LVDS信号环路测试](https://i-blog.csdnimg.cn/direct/2a06a5aebda54dd1be28ffb6f89d747e.png)




