ロックの競合を減らすためにストライピングを使用している大規模なデータ構造があります。現在、私はシステム ロックを使用していますが、99.99% の確率で、ロックは争われておらず、さらに、ロックを保持している時間はごくわずかです。ただし、ロックが保持されている間、いくつかの異なるメモリ操作が実行されます。実際には、データ構造にアクセスする全体の時間と比較して、ロックの取得と解放に費やされる時間が重要になるところまで来ています。
そこで、OS ロックを次の非常に単純なロックに置き換えることを考えています。FastTryLock() は 99.99% の確率で成功するため、ここでは試行とロック解除のみが表示されます。ここでの「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;
}
PC では、CPU がメモリの書き込み順序を保証するため、MemoryBarrier_LightWeight() はノーオペレーションです。