【问题标题】:One vector with multiple iterators in multithreaded lock free application在多线程无锁应用程序中具有多个迭代器的一个向量
【发布时间】:2014-04-18 13:27:48
【问题描述】:

我在 c++ 应用程序中具有以下功能:

  1. 有一个固定长度的预分配 std::vector
  2. 第一个线程通过向量进行查找(只是查找元素,匹配一些模式)
  3. 第二个线程有时会更新向量的元素(只是更新,不会删除元素)
  4. 第三个线程也更新向量元素(条件,当它与第二个线程重叠时绝对排除

每个线程都使用自己的迭代器来迭代向量元素。也就是说,一个迭代器只能被一个线程移动。

问题是:这是线程安全的吗,使用多个线程同时迭代 std::vector,而这又通过专用的迭代器来完成(每个线程为此目的使用自己的迭代器)。

我害怕的是,在 STL 深处的某个地方,它可能会导致一些故障(也许我是偏执狂)。我测试了这种方法,它似乎有效,但是希望从专家那里获得一些反馈。

【问题讨论】:

  • 除了读/写竞争条件之外你是安全的。
  • 一些 STL 实现(尤其是在调试版本中)会检查以确保正确使用迭代器(例如,不使用无效的迭代器)。很容易想象这些检查不是线程安全的情况。但这一切似乎都没有实际意义,因为当阅读器线程正在扫描元素时,编写器线程“更新”元素之间存在竞争条件。

标签: c++ multithreading vector stl lock-free


【解决方案1】:

STL 不是 MT 安全的。请查看Introductory-STL-tutorial - 特别是“多线程问题”一章。在您的情况下,线程 2 和 3 可以竞争相同的向量元素 - 因此您需要在每个元素中使用互斥锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2015-05-08
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多