1

同じクラスに次の 2 つのメソッドがある場合。

  bool CSettings::GetDelayTimer()
  {     
     return m_iTimerDelay;     
  }

  void CSettings::SetDelayTimer(int iTimerdelay)
  {
    m_iTimerDelay = iTimerdelay;
  }

上記のメソッドを同期するために、次のロック/ロック解除メソッドを作成しました。

  void CSettings::Lock()
  {
    DWORD dwRet = WaitForSingleObject(m_hSettingsLock, INFINITE);
    if( dwRet == WAIT_OBJECT_0)
      return;
  }

  void CSettings::UnLock()
  {
    ReleaseMutex(m_hSettingsLock);
  }

ロック/ロック解除を使用してこれらのゲッター/セッター メソッドを同期するにはどうすればよいですか。ゲッターメソッドでロックを使用すると、ロックを解除する前に返されるため、ロックを解除する機会がありません。私が言いたいのは: Lock(); m_iTimerDelay を返します。ロック解除(); うまくいきますか?Lock/UnLock を setter に適用しても問題ありません。

これらのメソッドを同期するアイデアはありますか?

よろしく、クラム。

4

1 に答える 1

3

RAIIを使用します。コンストラクタがロックを取得し、デストラクタがそれを解放するオブジェクトを作成します。次に、次のことができます。

{
    ScopedLock f(m_hSettingsLock);
    return m_iTimerDelay;
}

ScopedLock::~ScopedLockロックを解除しましょう。

または、最も劣っている可能性が高いもの:

{
    Lock();
    bool ret = m_iTimerDelay;
    Unlock();
    return ret;
}

どちらの場合も、戻り値が古い可能性があることに注意してください。

于 2013-10-23T06:00:15.713 に答える