【问题标题】:What's the difference between lockless and lockfree?无锁和无锁有什么区别?
【发布时间】:2013-12-09 09:30:16
【问题描述】:

在一些关于算法的文章中,有的使用lockfree这个词,有的使用locklesslocklesslockfree 有什么区别?谢谢!

更新

http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-programmers-guide.pdf

第 5.2 节 --“Linux* 中的无锁环形缓冲区”,这是一个使用“无锁”一词的示例

【问题讨论】:

  • 从这些文章的内容来看 - 你认为有区别吗?我只知道“无锁”,但不认为“无锁”描述了其他东西(参见“非阻塞”)。
  • 如果没有这些文章的链接,我想我们只是在猜测。它们的含义可能完全相同,或者它们试图强调一些细微的差别,但我通常认为它们是同义词。
  • @Damien_The_Unbeliever intel.com/content/dam/www/public/us/en/documents/guides/… section 5.2--"Lockless Ring Buffer in Linux*" 这是一个使用单词“lockless”的例子。

标签: lock-free lockless


【解决方案1】:

一个算法是无锁的,如果它满足当程序线程运行足够长的时间时,至少有一个线程取得进展(对于一些合理的进展定义)。所有的无等待算法都是无锁的。

一般来说,无锁算法可以运行在四个阶段:完成自己的操作,协助阻塞操作,中止阻塞操作,等待。完成自己的手术会因同时进行辅助和堕胎的可能性而变得复杂,但始终是完成手术的最快途径。例如非阻塞算法

无锁编程是一组无需使用锁即可安全操作共享数据的技术。有无锁算法可用于传递消息、共享列表和数据队列以及其他任务。无锁编程相当复杂。例如所有纯函数式数据结构本质上都是无锁的,因为它们是不可变的

【讨论】:

  • 我仍然不知道它们之间的区别,但这是目前最好的答案。所以给你硬币。
【解决方案2】:

无锁是一个更正式的东西(寻找无锁算法)。它对于数据结构的本质是,如果两个线程/进程访问该数据结构,其中一个死掉了,另一个仍然保证完成操作。

无锁是关于实现 - 这意味着算法不使用锁(或使用更正式的名称 - 互斥)。

因此,无锁算法也是无锁的(因为如果一个线程锁定然后死亡,另一个线程将永远等待)但不是相反 - 有些算法不使用锁(例如,他们使用比较- and-swap),但如果其他进程死亡,仍然可以挂起。上面提到的 dpdk ring buffer 就是 lockless 的一个例子,它不是无锁的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2012-03-12
  • 2011-04-13
  • 2012-08-03
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2018-09-11
相关资源
最近更新 更多