MFC CSingleLockの使用方法について

[戻る]
クルルンファ 2002/09/21(土) 19:40:21
はじめましてクルルンファと申します。
早速ですがMFCのCSingleLockクラスの使い方を教えていただきたいのですが
基本クラスのメンバ変数に定義したCCriticalSectionを使って以下の派生クラスのメンバ関数
でCSingleLockを使って排他制御を実現したいのですが。
2つのスレッドを用意して1つ目のスレッドはメンバ関数Set()でメモリにデータを書き、こう一
つのスレッドでGet()それを読む単純なものです。
この場合、以下のCoding(※1)で問題ないでしょうか?
※1のインスタンス生成の引数のTRUE,FALSEなんですが、TRUEで指定されたオブジェクトに最
初にアクセスを試みるかどうかを指定します。とMFCヘルプに書かれていますが今一使い方が良
くわかりません。或いは、※1の部分を※2のように記述した方がいいのでしょうか?
いきなりで申し訳ありませんが宜しくお願いします。

template <typename TYPE> class CDerivedCSharedStruct:public CSharedStruct<TYPE>
{
public:
    void    Set(int i)    //    構造体 m_Shs.item1[i]にiセット
    {
※1 -->        CSingleLock    Lock(&m_iCCriticalSection,TRUE);
        m_Shs.item_1[i] = i;
    }
    int        Get(int i) //    構造体 m_Shs.item1[i]の値取得
    {
※1 -->        CSingleLock    Lock(&m_iCCriticalSection,TRUE);
        return m_Shs.item_1[i];
    }
};

※2-->        CSingleLock    Lock(&m_iCCriticalSection,FALSE);
        if(Lock.IsLocked()){ // ロックされている
                Sleep(0);   // 待つ
        }else{
                          Lock.Lock(INFINITE);
                  }

MASATO [E-Mail] [HomePage] 2002/09/23(月) 11:26:04
※1で問題ないと思いますが、実際に実行し、問題が無いか試してみた方が良いです。
# 実際のコードもこのようなGet,Setだけだと
# CSingleLock周りを削っても問題が発生しそうに無いので
# 試すのは難しいですが・・・

CSingleLockのコンストラクタの第二引数をFALSEにした場合、
-----
int Get(int i)
{
  CSingleLock Lock(&m_iCCriticalSection,FALSE);
  Lock.Lock();
  return m_Shs.item_1[i];
  Lock.Unlock();
}
-----
と明示的にLock/Unlockを呼び出す必要があります。

クルルンファ 2002/09/24(火) 11:43:46
[[解決]]
MASATOさん。ありがとうございました。

も少し周辺を実装し、実際に実行して動作確認してみます。

古いスレッドには追加発言できません。