《并行编程中的“锁”难题》有12个想法

  1. 保护数据而不是操作
    目的 不是性能.
    而是 正确性,可读性,可维护性.

    在特定复杂的情况,出现某集中操作会出现竞争, 于是用锁来保护这些操作.
    这就是保护操作.

    这个结果是很难验证保护的正确,程序的正确无法得到保证,看代码的人也难看懂.
    改代码后,这些保护可能完全是错. Big Kernel Lock 是一个保护操作的锁.

    1. 是的。Big Kernel Lock使用起来简单,易懂,易维护,但是性能很低;把粗粒度的锁优化成细粒度的锁不紧要非常小心仔细,而且很容易出错,不易维护,但是锁竞争会降低,从而导致更好的性能。所以实际开发中往往要在开发难度和性能间做权衡。

  2. 我意思是 “保护数据而不是操作” 那章节写的不对……
    “保护数据而不是操作”的目的不是”性能”

  3. “保护数据而不是操作”确实能提高性能:把一些不会产生data race等多线程bug的操作移到临界区之外,这样就能减少锁竞争,提升多线程程序的性能。例如这个ppt里面的第13页,15页,17页中的例子:http://www.slideshare.net/ganzhi/highly-scalable-java-programming-for-multicore-system

    至于“保护数据而不是操作”提高可维护性,big kernel lock就是个例子,最简单的就是把所有操作都放到临界区里面去,这样肯定是不会出多线程bug了,但是性能却极大的下降了。现在Big Kernel lock已经逐渐被更细粒度的锁取代了。

    1. 操作结果产生的是数据的变化,所以看上去是保护操作,其实保护的是数据。

发表评论

电子邮件地址不会被公开。 必填项已用*标注