Комментарии 17
Вот действительно, напишите хоть в комментарии, зачем и когда оно нужно. Понятно, что вроде бы для оптимизации быстродействия, но на сколько и по сравнению с чем?
Предположу, что lock-free даёт выигрыш при параллельном программировании с сильной гранулярностью задач, когда расходы на традиционную синхронизацию велики.
Впрочем, я на практике с таким не встречался — обычно удавалось снизить гранулярность, либо подобный код вообще преобразовывался в асинхронный.
Также стоит отметить, что одновременный доступ к атомарному значению существенно снижает производительность. Может так оказаться, что однопоточная реализация алгоритма окажется быстрее многопоточного из-за отсутствия накладных расходов. Поэтому таких ситуаций лучше избегать совсем.
Насколько я знаю, есть две основные ситуации, где это нужно:
- Нужно гарантировать минимальную задержку выполнения для худшего случая. Пусть даже ценой ухудшения среднего быстродействия.
- Высокая загрузка системы (ну, просто при высокой загрузке мы стабильно попадаем в тот самый "худший случай").
Просто гуглеж на тему «lock free vs mutex» выдает какие-то пространные рассуждения на тему быстродействия, аналогично без конкретных замеров…
2. Если ресурс contended (за него борятся N >> 1 потоков одновременно), то N-1 из N потоков в CAS Loop уйдут на второй круг. Прирост производительности может быть если ресурс — не contended.
3. С блокировками много проблем в плане надежности.
локи надёжнее и проще разобраться если чтото пойдёт не так, ну и зачастую быстрееТак не бывает, извините. Чтобы было надёжнее, проще и быстрее — так бывает только в сказках. Локи надёжнее, но, разумеется, ни разу не быстрее если у вас реально есть одновременный доступ к одной и той же структуре данных.
часто заранее и не угадаешь, что быстрееКак-то попробовал написать очередь для собственных нужд, с использованием CAS — получилось в два раза быстрее, но едва логику блокировки усложняешь, и мьютексы догоняют и перегоняют.
10 — высокий, 1 — низкий. Точка равеновесия будет посредине, ищется экспериментальным путем. Предсказать заранее трудно
Введение в lock-free программирование