在监视器:: enter中应该是obj

时间:2012-08-17 23:24:38

标签: c++ .net c++-cli

我仍然熟悉多线程的锁定。

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.

任何提示都表示赞赏。

1 个答案:

答案 0 :(得分:0)

你的构造函数应该是:

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

您正在做的是创建一个新的本地变量,该变量立即超出范围,将其正在跟踪的对象带到早期的坟墓中。您打算做的是初始化成员变量。在您的情况下,成员变量一直保留null,导致您观察到的错误。

(因为我不熟悉CLI,可能是你不允许在构造函数初始化列表中初始化跟踪引用。在这种情况下,写这样:)

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