gpt4 book ai didi

c++ - 安全销毁包含 shared_ptr 的映射

转载 作者:行者123 更新时间:2023-11-30 01:23:09 25 4
gpt4 key购买 nike

我正在阅读 Mir project源代码,我偶然发现了这段代码:

void mir::frontend::ResourceCache::free_resource(google::protobuf::Message* key)
{
std::shared_ptr<void> value;
{
std::lock_guard<std::mutex> lock(guard);

auto const& p = resources.find(key);

if (p != resources.end())
{
value = p->second;
}

resources.erase(key);
}
}

我之前在其他项目中也看到过这种情况。它在删除之前保留对映射中值的引用,即使该 block 受 lock_guard 保护。我不确定他们为什么使用 std::shared_ptr value 来引用该值。

如果我们删除 value = p->second 会有什么影响?

谁能赐教吗?

这是代码 http://bazaar.launchpad.net/~mir-team/mir/trunk/view/head:/src/frontend/resource_cache.cpp

最佳答案

我猜这样做是为了避免在锁定的代码中运行 value 的析构函数。这个锁是为了保护映射的修改,不需要也不想要运行一些任意代码,例如另一个对象的析构函数被锁定。

试想一下,value 的析构函数出于某种原因间接访问映射或另一个线程共享结构。您有可能陷入僵局。

底端是:从锁定的代码中运行尽可能少的代码,但不能少。永远不要从锁定的代码中调用外部未知函数(例如 shared_ptr 删除器或回调)。

关于c++ - 安全销毁包含 shared_ptr 的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com