Может ли эта реализация Fast Atomic Lock работать? - PullRequest
1 голос
/ 13 июля 2010

У меня большая структура данных, которая использует чередование для уменьшения конкуренции за блокировку. Прямо сейчас я использую системные блокировки, но в 99,99% случаев блокировка не оспаривается и, кроме того, время, в течение которого блокировка удерживается, весьма незначительно. Тем не менее, несколько отдельных операций с памятью выполняются, пока блокировка удерживается. На самом деле он дошел до того, что время, затраченное на получение и снятие блокировок, является значительным по сравнению с общим временем доступа к структуре данных.

Так что я подумываю заменить блокировку ОС следующей очень простой блокировкой. Здесь показаны только попытки и разблокировка, потому что 99,99% времени FastTryLock () будет успешным. Переменная «pLock» здесь представляет собой точную блокировку гранулярности в полосатой структуре.

Я написал следующую реализацию, которая работает нормально, но я был бы признателен за подтверждение, если оно правильное или неправильное.

bool FastTryLock(DWORD *pLock)
{
    if(0==AtomicXCHG(pLock,1)) {
        MemoryBarrier_LightWeight(); return(true);
    }
    return(false);
}
void FastUnlock(DWORD *pLock)
{
    MemoryBarrier_LightWeight(); *((volatile DWORD*)pLock)=0;
}

На ПК MemoryBarrier_LightWeight () не работает, поскольку ЦП гарантирует порядок записи в память.

1 Ответ

1 голос
/ 14 июля 2010

Да, это метод, называемый спин-блокировка . Обратите внимание, однако, что указатель приведения к volatile не гарантированно работает в соответствии со стандартом. Просто объявите переменную блокировки как volatile.

...