是否有任何正在使用的并发算法在没有任何同步的情况下正常工作?

时间:2010-03-07 05:34:09

标签: algorithm concurrency theory

我在某些时候看到或听到的所有并发程序(不可否认的是一小部分)都使用硬件同步功能,通常是某种形式的compare-and-swap。问题是:是否存在任何并发程序,其中线程在整个生命中进行交互并且在没有任何同步的情况下离开?

我正在考虑的例子包括:

一个程序,相当于一个线程在大量案例中运行是/否测试,以及一大堆线程基于可能/无测试标记案例。这不需要同步,因为脏数据只会影响性能而不是正确性。

有许多线程更新数据结构的程序,其中任何现在有效的状态始终有效,因此脏读或写不会使任何内容失效。这方面的一个例子是(我认为)path compression in the union-find algorithm

7 个答案:

答案 0 :(得分:2)

如果你可以将工作分解为完全独立的块,那么是的是并发算法,其唯一的同步点是所有线程加入的工作结束时的同步点。然后,并行加速是能够分解大小尽可能类似的任务的一个因素。

答案 1 :(得分:2)

求解线性方程组的一些间接方法,如连续过度松弛(http://en.wikipedia.org/wiki/Successive_over-relaxation),并不需要迭代同步。

答案 2 :(得分:1)

我认为这是一个有点棘手的问题,因为例如如果用C编程,malloc()必须是多线程安全的并且使用硬件同步,而在Java中,垃圾收集器无论如何都需要硬件同步。所有Java程序都需要GC,几乎没有任何C程序没有malloc()(或C ++程序/ new()运算符)。

答案 3 :(得分:1)

有一类算法有时被称为“embarallel”(收缩“令人尴尬地平行”)。许多图像处理算法属于这一类,其中每个像素可以独立处理(这使得例如SIMD或GPGPU的实现非常简单)。

答案 4 :(得分:1)

好吧,如果没有任何同步(即使在算法结束时),你显然也无法做任何有用的事情,因为你甚至无法将并发计算的结果传递给主线程:假设他们在没有任何与主机通信的远程机器上。

答案 5 :(得分:1)

最简单的例子是java.lang.String内部,它是不可变的并且懒惰地缓存其哈希码。这个缓存是在没有同步的情况下写入的,因为(a)它更便宜,(b)值是可重新计算的,(c)JVM保证不会撕裂。在纯粹的功能上下文中,数据竞争的容忍度可以安全地使用这样的技巧,而无需显式同步。

答案 6 :(得分:0)

我同意米奇的回答。我想补充一点,光线跟踪算法可以在没有同步的情况下工作,直到所有线程都加入。