Может ли эта реализация 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
вместо.