代码之家  ›  专栏  ›  技术社区  ›  Anne Quinn

如何在不同步的情况下创建线程本地内存

  •  0
  • Anne Quinn  · 技术社区  · 6 年前

    我想给每个进入函数的线程一个它将只使用的对象(在本例中,它代表一页内存)。这有助于减少同步,我的程序正在瓶颈上,所以它本身最好不需要锁定互斥。

    我要做的事情的极简主义例子( std::map 不能同时插入,但如果可以,这将完全满足我的需要):

    // multiple threads can access this, they should be able to do so without synchronization
    void addJob(ThreadMemory * mem){
    
        // straight-forward, but undefined when used concurrently:
    
        static std::map<std::thread::id, ThreadMemoryPool> memPool;
        memPool[std::this_thread::get_id()].addRef(mem);
    
        // if memPool has no node for this thread, one is inserted,
        // every thready would be guaranteed one ThreadMemoryPool object
    
    }
    

    有没有办法达到同样的效果…嗯,这两行不需要锁就能完成的一般效果?

    1 回复  |  直到 6 年前
        1
  •  1
  •   chronoxor    6 年前

    您的解决方案将对所有线程使用相同的mempool,它的修改不是线程安全的。

    如果您希望拥有mempool的线程本地实例,则必须使用 线程本地说明符:

    thread_local std::map<std::thread::id, ThreadMemoryPool> memPool;
    

    在这种情况下,每个线程都将使用自己的mempool实例。