Может ли эта реализация Fast Atomic Lock работать?

У меня есть большая структура данных, которая использует чередование для уменьшения конкуренции за блокировку. Прямо сейчас я использую системные блокировки, но в 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 ответ

Решение

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

Другие вопросы по тегам