はじめましてクルルンファと申します。
早速ですが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);
}
※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を呼び出す必要があります。
MASATOさん。ありがとうございました。
も少し周辺を実装し、実際に実行して動作確認してみます。