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