0

volatile 値を使用して、単純なマルチリーダー/シングルライター ロックを実装したいと考えています。

_InterlockedXXX は完全なフェンス バリアを提供し、私が正しければ "volatile" キーワードも提供しますが、考えられる欠陥と改善点について知りたいです。取得/解放セマンティクスの経験はありません。

私のコード:

BOOL TryAcquireShared(LONG volatile *lpnValue) 
{ 
  LONG initVal; 

  do 
  { 
    initVal = *lpnValue; 
    if (initVal == 0x80000000L) 
      return FALSE; //a writer is active 
  } 
  while (_InterlockedCompareExchange(lpnValue, initVal+1, initVal) != initVal); 
  return TRUE; 
} 

VOID ReleaseShared(LONG volatile *lpnValue) 
{ 
  LONG initVal, newVal; 

  do 
  { 
    initVal = *lpnValue; 
    newVal = (initVal & 0x80000000L) | ((initVal & 0x7FFFFFFFL) - 1); 
  } 
  while (_InterlockedCompareExchange(lpnValue, newVal, initVal) != initVal); 
  return; 
} 

BOOL TryAcquireExclusive(LONG volatile *lpnValue) 
{ 
  LONG i, initVal, newVal; 

  do 
  { 
    initVal = *lpnValue; 
    if ((initVal & 0x80000000L) != 0) 
      return FALSE; //another writer is active or waiting 
  } 
  while (_InterlockedCompareExchange(lpnValue, initVal | 0x80000000L, initVal) != initVal); 
  //wait until no readers 
  while ((*lpnValue & 0x7FFFFFFFL) != 0) 
    ::Sleep(1); 
  return TRUE; 
} 

VOID ReleaseExclusive(LONG volatile *lpnValue) 
{ 
  _InterlockedExchange(lpnValue, 0); 
  return; 
} 

また、これに対応しているライブラリをご存知でしたら教えてください。

4

1 に答える 1