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,可能是不允许您在构造函数 initalizer 列表中初始化跟踪的引用。在这种情况下,这样写:)

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