zoukankan      html  css  js  c++  java
  • 阻塞,无锁,无等待的区别

    阻塞,blocking

    一个方法被称为阻塞的,即这个方法在其演进过程中不能正常运行直到其他(占有锁的)线程释放。

    也就是普通的synchronized方法,同一时间内只有一个线程占有了锁,其他线程只能等待。但是这个占有锁的线程并不一定真的在工作(可能被挂起了)。

    无锁,lock-free

    An algorithm is lock-free if, when the program threads are run for a sufficiently long time, at least one of the threads makes progress (for some sensible definition of progress). 

    如果所有线程运行了足够长时间后,至少有一个线程能获得进展,那么这个算法是无锁的。

    用人话讲就是:系统中无论何时,始终有一个线程在工作。

    无等待,wait-free

    An algorithm is wait-free if every operation has a bound on the number of steps the algorithm will take before the operation completes.

    假如一个方法是无等待的,那么它保证了每一次调用都可以在有限的步骤内结束。

    用人话讲就是,系统中的所有线程,都会在有限时间内结束,无论如何也不可能出现饿死(starving)的情况。

    再通俗一点的说:

    阻塞算法可能会出现整个系统都挂起的情况(占有锁的线程被中断,那么所有试图争用这个锁的线程会被挂起),系统中的所有线程全部饿死

    无锁算法可以保证系统中至少有一个线程处于工作状态,但是还是可能有线程永远抢不到资源而被饿死

    无等待算法保证系统中的所有线程都能处于工作状态,没有线程会被饿死,只要时间够,所有线程都能结束。

    The difference between wait-free and lock-free is that wait-free operation by each process is guaranteed to succeed in a finite number of steps, regardless of the other processors.

    补充:

    集居数无关无等待,Wait-Free-Population-Oblivious

    一个无等待的方法,如果其性能和活动线程数目无关,那么被称为集居数无关无等待的。

    这个是更强的wait-free算法,因为一般的wait-free中的每个线程虽然能在有限步数内结束,但是实际上它的开销往往与并发的线程数有关。可能工作线程越多,平均到每个线程头上的耗时就越长。

    而集居数无关无等待算法则可以理解为:线程的平均开销是一个与并发数n无关的函数。

    也就是说,我们可以通过无限制的增加线程数来提高总的工作效率(而且是线性扩展)。

    参考资料

    https://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom

    http://ifeve.com/lock-free-and-wait-free/

    http://ifeve.com/why-is-wait-free-so-important/

  • 相关阅读:
    全排列(next_permutation)
    Codeforces Round #321 (Div. 2)C(tree dfs)
    cf_ducational Codeforces Round 16_D(gcd)
    cf455a(简单dp)
    cf584a(水题)
    cf112a(水题)
    冒泡排序
    Python内置类型性能分析
    常见时间复杂度
    MongoDB 备份
  • 原文地址:https://www.cnblogs.com/stevenczp/p/6611041.html
Copyright © 2011-2022 走看看