c++ - 从容器中移动 unique_ptr 并将其删除是否安全?

标签 c++ multithreading locking unique-ptr

我想知道以下模式是否可以安全使用并且值得推荐?首先,我想将从容器中找到的 unique_ptr 移动到另一个临时 unique_ptr,然后从容器中删除它。然后,使用移动的指针调用实际方法。

这是为了避免在调用某些昂贵的方法时锁定整个容器。

请参阅以下示例:

std::unordered_map<string, std::unique_ptr<Sample>> samples;

std::unique_ptr<Sample> ptr_to_remove;

// Lock (reader lock) samples here.
auto it = samples.find(name);
if (it != samples.end()) {
   ptr_to_remove = std::move(it->second);
   samples.erase(it);
}
// Unlock samples here.

if (ptr_to_remove) {
    ptr_to_remove->DoSomeExpensiveTask();
}

最佳答案

是的,很安全。

unordered_map 的值类型不是 const,因此您可以修改它。从 unique_ptr 转移是安全的。从 map 中删除该项目将调用 unique_ptr 上的析构函数,这将销毁现在为空的 unique_ptr,这也是安全的。

代码示例中唯一可能不安全的部分是:

  • 有关 //lock 的注释应替换为作用域锁防护。
  • 我意识到这可能只是为了说明,但您在本地 unique_ptr 上调用 DoSomeExppressiveTask ,而没有首先检查它是否有值。

关于c++ - 从容器中移动 unique_ptr 并将其删除是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41231210/

相关文章:

c++ - 关于引用到常量(和指针到常量)的弱语义

iphone - applicationWillEnterForeground 后黑屏

c++ - 是否可以使用互斥锁只锁定数据结构的一个元素?

python - OpenCV Python 检测多尺度

c++ - STL 函数/Boost 函数类型定义错误

c++ - 如何使用单个解锁方法实现 C++ Reader-Writer 锁,可以称为读取器或写入器?

c# - 避免使用单独的线程从 BlockingCollection 获取重复值

java - 在java中使用多线程调用同一类的不同方法

c - 当只有一个线程写入共享变量时,我需要锁吗?

c# - 如何在线程之间传递锁?