【问题标题】:is local unordered_map variable thread safe in c++在 C++ 中局部 unordered_map 变量是线程安全的
【发布时间】:2019-08-04 17:50:39
【问题描述】:

我是 C++ 新手。我有一个关于std::mapstd::unordered_map 的局部变量用法的线程安全问题。

如果我在一个函数中声明了std::mapstd::unordered_map的局部变量,并且想在函数内的局部变量中插入元素或增加元素值,当函数被调用时,这些局部变量是线程安全的吗?多线程无锁?

示例代码:

void func(const std::string &a, int b)
{
    std::map<std::string, int> var1;

    auto search = var1.find(a)

    if ( search != var1.end() )
    {
       var1.insert(make_pair(a,b) );
    }
    else
    {
       var1[a] = var1[a] + b;
    }

    std::unordered_map<std::string, int> var2;

    auto search = var2.find(a)

    if ( search != var2.end() )
    {
       var2.insert(make_pair(a,b) );
    }
    else
    {
       var2[a] = var2[a] + b;
    }
}

func() 将被多个线程调用。 var1var2 线程安全吗?或者,函数中是否需要使用互斥锁?

【问题讨论】:

  • 局部变量是local。任何线程不安全的东西都有被多个线程访问的non-local。需要互斥锁来准确保护此类数据。
  • 在答案部分请不要在这里
  • 局部变量存储在堆栈中,每个线程都有自己的堆栈,因此任何仅本地的都是线程安全的。除非在文档中如此指定,否则任何非本地的东西都不是线程安全的。

标签: c++ multithreading


【解决方案1】:

函数的每次调用都有自己的局部变量。您可以安全地从多个线程调用此函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 2017-03-07
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多