C++ C++;:带有一组指针容器的锁定机制

C++ C++;:带有一组指针容器的锁定机制,c++,multithreading,C++,Multithreading,我有一个 std::map<std::string, Something*> myMap 如果我还想删除myMap中的条目,则此结构无法正常工作,因为我可以删除仍被其他人锁定的内容(但已解锁myMap) 你知道有什么模式可以解决我的问题吗?你可以使用std::shared\u ptr而不是Something*。当对象的引用计数等于0时,Something对象将被删除。因此,如果线程锁定了某个对象(并从myMap获取std::shared\u ptr)然后,即使其他线程从myMap中

我有一个

std::map<std::string, Something*> myMap
如果我还想删除
myMap
中的条目,则此结构无法正常工作,因为我可以删除仍被其他人锁定的内容(但已解锁
myMap


你知道有什么模式可以解决我的问题吗?

你可以使用
std::shared\u ptr
而不是
Something*
。当对象的引用计数等于0时,
Something
对象将被删除。因此,如果线程锁定了
某个对象(并从
myMap
获取
std::shared\u ptr
)然后,即使其他线程从
myMap

中删除带有此
Something
对象的条目,也不会删除
Something
对象。您可以使用
std::shared\u ptr
而不是
Something*
。当引用计数等于0时,将删除
southing
对象。因此,如果线程锁定了
某个对象(并从
myMap
获取
std::shared\u ptr
)然后,即使其他线程从
myMap

中删除带有此
Something
对象的条目,也不会删除
Something
对象。如果
Something*
只能通过通用映射锁从不同线程访问,则不需要拥有自己的锁:
myMapLock.lock();Something*some=myMapLock[key];//用myMapLock.unlock()做点什么如果所有线程都以相同的方式工作,这是正常的。两级锁定机制是由于性能原因。一个线程可以长时间锁定单个某物:为每个某物使用互斥锁*可以提高性能。全局锁是必需的,因为我还可以从std::mapIf
中添加/删除内容*
只能通过常规的映射锁从不同的线程访问,它不需要有自己的锁:
myMapLock.lock();Something*some=myMapLock[key];//用myMapLock.unlock()做点什么如果所有线程都以相同的方式工作,这是正常的。两级锁定机制是由于性能原因。一个线程可以锁定单个对象*很长时间:为每一个东西设置一个互斥锁*可以提高性能。全局锁是必要的,因为我也可以从std::map中添加/删除内容。因此,您的解决方案是:保留两级锁定机制,但永远不要显式地执行“删除某个内容*”,当我必须删除某个内容*,我会锁定整个映射,删除条目,并让共享的ptr执行实际的删除,对吗?是的。如果您需要使用两级锁定机制,那么您的解决方案是:保留两级锁定机制,但永远不要显式执行“删除某物*”,当我必须删除某物*,我会锁定整个地图,删除条目,并让共享的ptr执行实际的删除,对吗?是的。如果需要使用两级锁定机构。
myMapLock.lock();
Something* some = myMapLock[key];
myMapLock.unlock();
some.lock();
// do something with some
some.unlock();