在一些关于算法的文章中,有的使用了这个词lockfree
,有的使用了lockless
。lockless
和有什么区别lockfree
?谢谢!
更新
http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-programmers-guide.pdf
第 5.2 节 --“Linux* 中的无锁环形缓冲区”,这是使用“无锁”一词的示例
在一些关于算法的文章中,有的使用了这个词lockfree
,有的使用了lockless
。lockless
和有什么区别lockfree
?谢谢!
更新
http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-programmers-guide.pdf
第 5.2 节 --“Linux* 中的无锁环形缓冲区”,这是使用“无锁”一词的示例
如果一个算法满足以下条件,即当程序线程运行足够长的时间时,至少有一个线程取得进展(对于进展的一些合理定义),它就是无锁的。所有无等待算法都是无锁的。
一般来说,无锁算法可以运行在四个阶段:完成自己的操作、辅助阻塞操作、中止阻塞操作和等待。完成自己的手术会因同时进行辅助和堕胎的可能性而变得复杂,但始终是完成手术的最快途径。例如非阻塞算法
无锁编程是一组无需使用锁即可安全操作共享数据的技术。有无锁算法可用于传递消息、共享列表和数据队列以及其他任务。无锁编程相当复杂。例如,所有纯函数式数据结构本质上都是无锁的,因为它们是不可变的
无锁是一个更正式的东西(寻找无锁算法)。它对于数据结构的本质是如果两个线程/进程访问该数据结构并且其中一个死掉了,另一个仍然保证完成操作。
Lockless 是关于实现的——这意味着算法不使用锁(或使用更正式的名称——互斥)。
因此,无锁算法也是无锁的(因为如果一个线程锁定然后死亡,另一个线程将永远等待)但不是相反 - 有些算法不使用锁(例如,它们使用比较和交换) 但如果其他进程死亡,仍然可以挂起。上面提到的 dpdk 环形缓冲区是无锁的一个例子,它不是无锁的。