3

強制されます:(C++ CLIで動作するように私はRAIIロックを行う方法を探しています。私が思いついたのは:

ref class RAIIMonitor
{
    RAIIMonitor();
    T^ t;
public:
    RAIIMonitor(T^ t_)
    {

        t=t_;
        System::Threading::Monitor::Enter(t_);
    }
    ~RAIIMonitor()
    {
        System::Threading::Monitor::Exit(t);
    }
    !RAIIMonitor()
    {
        assert(0); // you are using me wrong
    }
};

利用方法:

 //begining of some method in MyRefClass
 RAIIMonitor<MyRefClass> monitor(this);    

それで、これは正しい方法ですか、それを行う方法がない場合、はいの場合、それをより良くする方法がありますか?

4

1 に答える 1

6

Microsoft は、これを行うためのクラスを提供しています。#include <msclr/lock.h>、そしてロッククラスを見てください。これをスタック セマンティクスと組み合わせると、RAII ロックが得られます。

単純な使用例では、単純にロック オブジェクトをローカル変数として宣言し、ロックするオブジェクトを渡します。デストラクタがスタック セマンティクスを介して呼び出されると、ロックが解除されます。

void Foo::Bar()
{
    msclr::lock lock(syncObj);
    // Use the protected resource
}

ロック クラスは、 、 、および メソッドも提供AcquireTryAcquireますRelease。すぐにロックを実行せず、後でロックするために使用できるコンストラクターがあり、自分で Acquire または TryAcquire を呼び出します。

(実装を見ると、RAIIMonitor クラスで開始したものの完全な実装であることがわかります。)

于 2012-07-03T12:15:58.810 に答える