В чем разница между lockless и lockfree?


В некоторых статьях об алгоритме некоторые используют слово lockfree, а некоторые используют lockless. В чем разница между lockless и lockfree? Спасибо!

Обновить

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

Раздел 5.2 -- " Lockless Ring Buffer in Linux*", это пример использования слова "lockless"

2 7

2 ответа:

Алгоритм свободен от блокировки, если он удовлетворяет тому, что при достаточно длительном выполнении программных потоков по крайней мере один из потоков выполняет прогресс (для некоторого разумного определения прогресса). Все алгоритмы без ожидания не содержат блокировок.

В общем случае алгоритм без блокировки может выполняться в четыре этапа: Завершение собственной операции, оказание помощи препятствующей операции, прерывание препятствующей операции и ожидание. Выполнение собственной операции осложняется возможностью одновременного помощь и аборт, но это неизменно самый быстрый путь к завершению. например, неблокирующие алгоритмы

Lockless programming-это набор методов безопасного управления общими данными без использования блокировок. Существуют алгоритмы без блокировки для передачи сообщений, совместного использования списков и очередей данных и других задач. Программирование без блокировки довольно сложно. например, все чисто функциональные структуры данных по своей сути свободны от блокировки, поскольку они неизменны

Lock-free - это более формальная вещь (ищите алгоритмы без блокировки). Суть его для структур данных заключается в том, что если два потока/процесса обращаются к структуре данных и один из них умирает, другой все равно гарантированно завершает операцию.

Lockless - это реализация, то есть алгоритм не использует блокировок (или использует более формальное название - взаимное исключение).

Поэтому алгоритм без блокировки также не имеет блокировки (потому что если один поток блокируется, а затем умирает другой будет ждать вечно), но не наоборот - есть алгоритмы, которые не используют блокировки (например, они используют сравнение и обмен), но все равно могут зависнуть, если другой процесс умирает. Кольцевой буфер dpdk, упомянутый выше, является примером lockless, который не является lock-free.