【问题标题】:Need to lock a copy of an stl::map of pointers while reading?阅读时需要锁定指针的 stl::map 副本吗?
【发布时间】:2013-07-17 07:16:39
【问题描述】:

我有一个stl::map<int, *msg> msg_container,其中msg 是一个类(此处不相关)。

有多个线程添加到全局msg_container,并为同步访问设置了锁。

在单独的线程中,它需要在特定时间评估msg_container 的本地副本并对其执行检查。伪代码如下

map<int, *msg> msg_container;
map<int, *msg> msg_container_copy;

if (appropriate_time_is_reached)
{
    msg_container_copy = msg_container;

    //perform functions on msg_container_copy
}

根据我的previous question,我知道我需要在阅读时锁定msg_container,如果有可能其他线程正在添加它。

这样使用msg_container_copy需要加锁吗?它仅对该线程是本地的,因此没有其他线程将访问它。

【问题讨论】:

    标签: multithreading map stl thread-safety


    【解决方案1】:

    如果正如您所描述的,“它仅对这个线程是本地的,所以没有其他线程将访问它。”

    顺便说一句,如果msg是一个类,我认为定义“stl::map&lt;int, *msg&gt; msg_container;”应该写成“stl::map&lt;int, msg *&gt; msg_container;”,这样msg *就是一个指针类型。一定是笔误。

    【讨论】:

    • 问题出现是因为获取地图的副本 - 也意味着获取指针的副本(据我所知)。是容器的多次访问而不是其元素的多次访问导致线程不安全吗?
    • @sccs 是的,这就是为什么你应该锁定 msg_container 以防止被其他线程访问。但是正如你所说,msg_container_copy 是该线程本地的,在不锁定的情况下引用时不会中断。
    • @sccs 数据竞争的定义是对同一个对象进行多个同时访问,其中至少一个是修改。容器的元素是与容器本身不同的对象。
    【解决方案2】:

    您不需要锁来访问msg_container_copy,因为没有其他线程可以访问它。

    在取消引用它包含的指针时,您可能需要一个锁,因为它们与其他线程共享。这取决于您如何处理这些指针。

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多