AFAIK,多线程编程的一个主要目标是通过使用多个处理核来提高性能.重点是最大化并行执行。
当我看到线程安全的泛型数据结构类时,我感到有些讽刺。因为线程安全意味着执行串行执行(锁、原子操作或其他什么),所以它是反并行的。线程安全类意味着序列化被封装并隐藏到类中,因此我们将有更多的机会强制串行执行丢失性能。最好是在更大(或最大)的单元应用逻辑中管理这些关键部分。
那么为什么人们想要线程安全的类呢?他们真正的好处是什么?
我的意思是线程安全类是一个类,它只有线程安全的方法,可以同时从多个线程调用。安全意味着它保证了正确的读写结果。正确的意思是它的结果等于单线程执行下的结果。(例如避免ABA问题)
因此,我认为线程安全在我的问题中包含了串行执行的定义。这就是为什么我对它的目的感到困惑,并问了这个问题。
发布于 2013-08-30 04:10:08
我认为您的问题有一个错误的假设:同步操作根本不是反并行的。如果没有某种形式的同步,就无法构建并行的可变数据结构。是的,这些同步机制的大量使用将降低代码并行运行的能力。但是,如果没有这些机制,首先就不可能编写代码。
一种不需要同步的线程安全数据结构是不可变的值。但是,它们只适用于一组场景(并行读取、数据传递等)。
发布于 2013-08-30 04:07:54
线程安全数据结构可以在不序列化的情况下实现。这是一个棘手的问题,但它是可行的,而且已经完成。然后,您就有了并发性的好处,而没有任何瓶颈。
发布于 2013-08-30 04:13:33
这就是为什么性能关键的多线程代码避免使用“线程安全”容器的原因。像std::载体等容器并不是线程安全的。如果应用程序需要在不同线程之间共享对这些容器的访问,则应用程序负责管理该访问。
另一方面,有时性能不是多线程的驱动程序。GUI程序受益于将UI线程与正在执行工作的线程分开。其他的线程可能会由于各种原因而被剥离。一般来说,这样可以很好地分离代码中的职责,并为应用程序提供更好的整体活力。在这些情况下,目标往往不是高性能本身。对于这些应用程序来说,使用线程安全容器可能是一个非常自然的选择。
当然,最好的选择是吃蛋糕,就像一些无锁队列实现一样,它允许一个线程为队列提供数据,另一个线程使用它,而不需要锁定(仅依赖于某些基本操作的原子性质)。
https://stackoverflow.com/questions/18524710
复制相似问题