std::unique_ptr的STL容器中find()的线程安全性

thread safety of find() from a STL container of std::unique_ptr

本文关键字:find 线程 安全性 unique ptr STL std      更新时间:2023-10-16

示例代码。

class Obj
{
    public:
    void doSome(void)
    {
        std::cout << "Hello World!" << std::endl;
    }
};
std::unordered_map<int, std::unique_ptr<Obj>> map;
// insert -- done with single thread and before find()
map[123] = std::move( std::unique_ptr<Obj>(new Obj) );
// find -- run from multiple threads
auto search = map.find(123);  // <=== (Q)
if (search != map.end())      
{
  search->second->doSome();
}

(Q(

如果有多个线程运行//find带有map.find(123(的部分,线程安全性如何?

映射。find(123(始终在每个线程中找到对象?只要搜索->秒没有分配给其他人?

当多个线程访问同一个变量,并且其中至少有一个线程向该变量写入时,就会发生数据竞争。这里的情况并非如此,每个人都在读取相同的数据。没关系。不过,还有另一个问题在这段代码中没有得到解决:根据数据何时存储到映射对象中,一些线程可能看不到映射对象的更新版本。处理此同步问题的最简单方法是在创建任何读取器线程之前设置映射对象。

无序映射中的find()和任何其他方法都不是线程安全的。如果一个执行线程可以调用find(),而另一个线程可以调用任何修改它的无序映射方法,则会导致未定义的行为。

如果多个执行线程使用相同的键调用find(),那么只要没有未定义的行为,所有执行线程都将获得该键的相同值。