Я не писал ничего, связанного с STM (Software Transactional Memory), только читал информацию в Интернете. Так вот просто воображаемый пример
Предположим, у нас есть буфер FIFO с максимально допустимым количеством элементов в нем. Таким образом, мы заполняем массив до тех пор, пока не будет достигнуто максимальное количество элементов, и сдвигаем его, когда элементов больше не осталось. При традиционном подходе я бы заблокировал не только фактическое смещение и добавление, но и условное чтение, которое проверяет, достигнут ли максимум. Я должен сделать это, иначе два потока могут симулировать решение, что единственный оставшийся элемент предназначен для них. Так что у меня здесь некая логическая блокировка, не связанная напрямую с писательским конфликтом.
Я полагаю, что с STM два потока могут решить, что элемент остался, и попытаться заполнить последний элемент. Но правильность сохраняется, поскольку откат запускается в одном потоке (или в обоих) после обнаружения того, что другой поток модифицировал ту же память. Оптимистичный сценарий говорит о том, что когда-то один из потоков наконец-то увеличит количество элементов, а другой, наконец, уйдет в другую ветвь (перемещение FIFO). Но я также вижу здесь возможность бесконечного цикла, если оба продолжают замечать, что последний элемент остался, и пытаются его заполнить.
Так что мне все еще нужно добавлять «логические» блокировки при написании программного обеспечения, связанного с STM?