我想给进入函数的每个线程一个仅它会使用的对象(在这种情况下,它代表一个内存页面)。这是为了帮助减少程序瓶颈的同步,因此理想情况下它本身不需要锁定互斥锁。
我正在尝试做的极简示例(不能同时插入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
}
有没有一种方法可以实现相同的...这两行想要完成而无需锁定的一般效果?
最佳答案
您的解决方案将对所有线程使用相同的memPool,并且其修改不是线程安全的。
如果您想拥有memPool的线程本地实例,则必须使用
thread_local说明符:
thread_local std::map<std::thread::id, ThreadMemoryPool> memPool;
在这种情况下,每个线程将使用其自己的memPool实例。