Здравствуйте, pif_pif, Вы писали:
_>Есть подозрение, что этот алгоритм не свободет от data race. Т.е. между этой строкой
_> intptr_t dif = (intptr_t)seq — (intptr_t)pos;
_>и этой проверкой
_> if (dif == 0)
_>значение pos может быть изменено в другом потоке, и проверка будет не валидной.
Тогда последующий CAS не сработает.
_> Intel Parallel Inspector это подтверждает:
_>ID Description Problem Source Function Module State
_>X7 Read Data race lockfree.cpp:24 load lockfree.exe Not fixed
_>X9 Write Data race lockfree.cpp:41 store lockfree.exe Not fixed
_>X6 Write Data race lockfree.cpp:48 compare_exchange_weak lockfree.exe Not fixed
_>X8 Allocation site Data race newaop.cpp:7 new[] lockfree.exe Information
Inspector не умеет проверять такой код.