【问题标题】:Do concurrent data structures and thread safe data structures mean the same?并发数据结构和线程安全数据结构的意思是一样的吗?
【发布时间】:2014-10-14 07:33:03
【问题描述】:

并发数据结构:

[1]http://www.cs.tau.ac.il/~shanir/concurrent-data-structures.pdf

[2]http://en.wikipedia.org/wiki/Concurrent_data_structure

并发数据结构和线程安全数据结构可以互换吗?

【问题讨论】:

    标签: multithreading concurrency language-agnostic parallel-processing concurrent-programming


    【解决方案1】:

    我的理解与@xxa 不同(答案是:)。虽然我也没有一个地区性的定义。 Concurrent 暗示线程安全。但如今,它也意味着同时访问。虽然线程安全没有给出这样的假设。请参阅上述Wiki-article 的引用:

    今天,随着提供并行性的多处理器计算机体系结构成为主要的计算平台(通过多核处理器的普及),该术语主要代表可以由多个线程访问的数据结构,这些线程实际上可以访问数据同时,因为它们运行在相互通信的不同处理器上。

    例如,STL 容器声称在给定条件下是线程安全的(只读),此外,它允许多个线程同时读取(STL 说它们“与 int 一样安全”),但是只有一个线程可以修改它们并且没有读者。我们可以将它们命名为“并发”吗?不会。虽然实际的并发容器(例如参见 )允许至少两个或更多线程同时使用容器(包括修改)。

    还有一点。您可以实现 std::queue 以便方法 push() 和 pop() 在不同线程使用时不会触发失败。但这是否使它成为concurrent_queue?不会。因为queue::front()queue::pop() 没有提供在没有外部同步的情况下由两个或多个线程同时获取元素的方法。要成为concurrent_queue,它需要不同的接口,通过结合 pop() 和返回值来处理原子性。

    【讨论】:

    • 您建议的区别很重要,但我不认为应该在“线程安全”和“并发”之间划清界限。 [1] 讨论了术语“非阻塞技术”与“阻塞技术”下的同时访问,并在后一种情况下进一步讨论了“细粒度锁定”。但它似乎并不排除在并发数据结构的情况下使用的阻塞技术。 tbb 还提供互斥方式,明确要求独占访问。
    • 我同意这条线是模糊的,但至少,它被 TBB 开发人员所接受。术语“并发容器”并不规定容器是非阻塞的还是细粒度的。它只是说两个或多个线程可以同时/同时至少在两个不同的元素上执行操作。虽然线程安全仅表明从不同线程访问容器是安全的,并且不提供操作是否被序列化的线索。
    • 在这种情况下“并发”的含义如何演变很有趣,因为在关于“并发”与“并行”(stackoverflow.com/questions/1050222/…)含义的类似辩论中,共识似乎是“并发”是一个更笼统的术语,而“并行”意味着事件实际上是同时发生的。不幸的是,与数据结构相关的事情朝着相反的方向发展。
    • 我同意“并发”更广泛,而“并行”提供更强的保证。但是没有“并行容器”这样的术语,它只能用于执行过程。
    • 所以,总而言之,线程安全的数据结构将在进程并发执行时使用,但并发数据结构只有在进程并行执行时才有意义。可以这样定义事物,但我认为这不是完全一致的使用方式。
    【解决方案2】:

    这些术语没有严格的定义,但通常可以断言您的问题的答案是。 两者都指存​​储在共享内存 (http://en.wikipedia.org/wiki/Shared_memory) 中并由多个线程或进程操作的数据结构。

    事实上 [1] 在显式引用线程时断言相同:

    这个额外困难的主要来源是并发性:因为线程在不同的处理器上同时执行,......”

    【讨论】:

      猜你喜欢
      • 2013-06-10
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多