【问题标题】:Simple C++ container class that is thread-safe for writing编写线程安全的简单 C++ 容器类
【发布时间】:2010-04-21 19:58:34
【问题描述】:

我正在使用 C++ 中的 OpenMP 编写一个多线程程序。在某一时刻,我的程序分叉成许多线程,每个线程都需要将“作业”添加到某个容器中,以跟踪所有添加的作业。每个作业都可以只是指向某个对象的指针。

基本上,我只需要同时从多个线程添加指向某个容器的指针。

有没有表现良好的简单解决方案?经过一番谷歌搜索,我发现 STL 容器不是线程安全的。一些stackoverflow threads 解决了这个问题,但没有人就简单的解决方案形成共识。

【问题讨论】:

  • 除非您有非常具体的使用要求,否则使用列表以外的任何类型的容器几乎总是更好。 std::dequestd::vector 在绝大多数情况下要好得多。 (std::stack 默认使用deque 实现)
  • TBB 提供了一些 -> threadingbuildingblocks.org

标签: c++ data-structures parallel-processing thread-safety


【解决方案1】:

没有内置的方法可以做到这一点。您可以简单地使用锁来保护现有容器类型之一。让每个线程使用它自己的容器可能是一个更好的主意,然后最后将结果组合在一起。

【讨论】:

    【解决方案2】:

    使用互斥锁或类似的同步原语来控制对链表的访问并不是很困难,所以我建议你先尝试一下。

    如果它的性能太差以至于你不能使用它,试试这个:给每个线程一个自己的作业队列,让作业消费者依次检查所有的队列。这样每个队列只有一个读取器和一个写入器,因此无锁实现相对简单。我的意思是它可能存在于您的平台上;你不应该尝试自己写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      相关资源
      最近更新 更多