1

実際に2つの質問があります。最初の質問です。

2つの異なるサイトで見つけたコードを使用して、これら2つのクリティカルセクションラッパークラスを作成しました。

それはうまくいくでしょうか?

#ifndef CRITICALSECTION_H
#define CRITICALSECTION_H
#include "windows.h"



class CriticalSection{
    long m_nLockCount;
    long m_nThreadId;
    typedef CRITICAL_SECTION cs;
    cs m_tCS;
public:
    CriticalSection(){
        ::InitializeCriticalSection(&m_tCS);
        m_nLockCount = 0;
        m_nThreadId = 0;
    }
    ~CriticalSection(){ ::DeleteCriticalSection(&m_tCS); }
    void Enter(){ ::EnterCriticalSection(&m_tCS);  }
    void Leave(){  ::LeaveCriticalSection(&m_tCS); }
    void Try();
};


class LockSection{
    CriticalSection* m_pCS;
public:
    LockSection(CriticalSection* pCS){
        m_pCS = pCS;
        if(m_pCS)m_pCS->Enter();
    }
    ~LockSection(){
        if(m_pCS)m_pCS->Leave();
    }
}

/*

Safe class basic structure;

class SafeObj
{
     CriticalSection m_cs;

public:
    void SafeMethod()
    {
        LockSection myLock(&m_cs);
        //add code to implement the method ...

    }
};



*/
#endif

そして2番目の質問。ここを閲覧していると、作者が含まれていないことに気づきました

::初期化、削除、入力、クリティカルセクションを残す。クラスが正しく機能するためにこれらは必要ではありませんか?それとも私は何かが足りないのですか?

4

2 に答える 2

2

LockSectionクラスはRAIIを使用してEnterとを呼び出しますLeave。オブジェクトが作成されると、Enterが呼び出されます。オブジェクトが(スコープ外になることによって)破棄されると、Leaveが呼び出されます。

InitializeクラスのコンストラクタとデストラクタDeleteによって呼び出されます。CriticalSection

RAIIを学び、よく学びましょう。それはあなたの友達です。

于 2011-10-06T18:16:32.127 に答える
2

最初の質問に答えます。2番目の質問は別のサイトのコードに関するものであり、一度に1つの質問のみを行う必要があります。おそらく他の誰かが2番目の質問に答えるでしょう。

含めたコードは正しく機能します。メンバーm_nLockCountm_nThreadIdは未使用で不要です。このTry()メソッドには実装がありませんが、削除するだけです。

個人的にm_pCSは、割り当てられていない場合は例外を発生させます。これは明らかなエラー状態です。黙って継続し、リソースが保護されているふりをすることは明らかな危険です。

于 2011-10-06T18:17:39.717 に答える