Intel Inspector сообщает о гонке данных в моей реализации спин-блокировки

Я сделал очень простую спин-блокировку, используя функции Interlocked в Windows, и протестировал ее на двухъядерном процессоре (два потока, которые увеличивают переменную);

Программа работает нормально (каждый раз выдает один и тот же результат, а это не тот случай, когда синхронизация не используется), ноIntel Parallel Inspector говорит, что есть состояние гонки назначение + = j (см. код ниже). Предупреждение исчезает при использовании критических разделов вместо моего SpinLock.

Моя реализация SpinLock правильная или нет? Это'Это действительно странно, потому что все используемые операции являются атомарными и имеют надлежащие барьеры памяти, и это не должноне приводит к условиям гонки.

class SpinLock
{
   int *lockValue;
   SpinLock(int *value) : lockValue(value) { }

   void Lock() {
      while(InterlockedCompareExchange((volatile LONG*)lockValue, 1, 0) != 0) {
          WaitABit();
      }
   }

   void Unlock() { InterlockedExchange((volatile LONG*)lockValue, 0); }
};

Тестовая программа:

static const int THREADS = 2;
HANDLE completedEvents[THREADS];
int value = 0;
int lock = 0; // Global.

DWORD WINAPI TestThread(void *param) {
    HANDLE completed = (HANDLE)param;
    SpinLock testLock(&lock);

    for(int i = 0;i < 1000*20; i++) {
        for(int j = 0;j < 10*10; j++) {
            // Add something to the variable.
            testLock.Lock();
            value += j;
            testLock.Unlock();
        }
    }
    SetEvent(completed);
}

int main() {
   for(int i = 0; i < THREADS; i++) {
        completedEvents[i] = CreateEvent(NULL, true, false, NULL);
   }
   for(int i = 0; i < THREADS; i++) {
        DWORD id;
        CreateThread(NULL, 0, TestThread, completedEvents[i], 0, &id);
   }

   WaitForMultipleObjects(THREADS, completedEvents, true, INFINITE);
   cout

Ответы на вопрос(3)

Ваш ответ на вопрос