Это книга А. Уильямса «Параллелизм C ++ в действии», стек без блокировок с темой указателей опасности. Предположим, я понял это, за исключением двух строк, вот они ( источник Вот):
// code before
if (old_head) {
res.swap(old_head->data);
// code after
Вопрос в следующем: может ли другой поток удалить (изменить и т. Д.) Указатель «old_head», прежде чем он будет разыменован (old_head-> data)? Логика говорит, что нет, потому что весь код Уильямса ошибочен, но я сомневаюсь, что это некая атомарная операция. Как вы думаете?
Если old_head
доступно для нескольких потоков, и блок кода в кавычках не защищен никаким механизмом синхронизации, тогда да old_head
может быть изменен между проверкой и разыменованием. if
Само по себе утверждение не гарантирует атомарности.
Других решений пока нет …