0

私はまだマルチスレッドのロックに慣れています。

Monitor::Enter(obj);

try
{   
    ///do work
}

finally
{
    Monitor::Exit(obj);
}

何をどこobjで宣言する必要がありますか?私はそれをクラスLocatorのコンストラクターで宣言しています。

Locator()
{ 
    System::Object^ obj = gcnew System::Object();
}

objクラスのプライベート変数で宣言します

private:
    System::Object^ obj;

Monitor::Enter(obj)しかし、それは私に言った後にエラーを与えています

Value cannot be null.

ヒントをいただければ幸いです。

4

1 に答える 1

0

コンストラクターは次のようにする必要があります。

Locator()
: obj(gcnew System::Object())
{  }

あなたがやっていることは、すぐにスコープから外れる新しいローカル変数を作成し、それが追跡しているオブジェクトを早期の墓場に持っていくことです。あなたがするつもりだったのは、代わりにメンバー変数を初期化することです。あなたの場合、メンバー変数はnullずっと残っていたため、観察したエラーが発生しました。

(私はCLIをよく知らないので、コンストラクターの初期化リストで追跡された参照を初期化することは許可されていない可能性があります。その場合は、次のように記述してください:)

Locator() { obj = gcnew System::Object(); }
于 2012-08-17T23:31:45.423 に答える