Здравствуй, сетка.
Думаю стоит сказать, что lock_free очень ограниченая оптимизация.
lock_free славиться тем что блокирует доступ потоков к ресурсам на мгновение подмены указателя. А если просто подменить указатель-смарт принтер то не выполнить кода над разделяемыми ресурсами с этой блокировкой. Поэтому lock_free относиться в основном к контейнерам. Будем дальше говорить о lock_free контейнерах.
Возьмём к примеру очередь FIFO. Если сделать две lock_free блокировки на конец и на начало очереди то когда остаётся один элемент в очереди и при этом добавляется то сработает одна из блокировок причём не понятно какая. Поэтому последовательность блокировок не определена. Поэтому когда пишешь код в случае когда очередь пуста предположить что писать из блокировок не возможно, а значит не написать код ввода произвольного элемента.
Отсюда следует что может быть только одна lock_free блокировка в контейнере и при этом нужно писать bool try_pop и bool try_push для очереди. Со стеклом всё хорошо.
В заключении сказать хочу, что для масштабируемых проектов писать оптимизации значит нагрузить своё личное время особенно когда используются новшества. Внимательной работы всем!