0

我有一个具有两个功能的线程类:

using namespace System::Threading;
public ref class SecThr
{
public:
 int j;

void wralot()
{
    for (int i=0; i<=400000;i++)
    {
    j=i;
    if ((i%10000)==0) 
        Console::WriteLine(j);
    }
}

void setalot()
{
    Monitor::Enter(this);
    for (int i=0; i<=400000;i++)
    {
    j=7;
    }
    Monitor::Exit(this);

}
 };


int main(array<System::String ^> ^args)
{
Console::WriteLine("Hello!");

SecThr^ thrcl=gcnew SecThr;
Thread^ o1=gcnew Thread(gcnew ThreadStart(thrcl, &SecThr::wralot));
Thread^ o2=gcnew Thread(gcnew ThreadStart(thrcl, &SecThr::setalot));
o2->Start();
o1->Start();
o1->Join();
o2->Join();

所以,为了锁定“setalot”功能,我使用了 MOnitor::Enter-Exit 块。但是输出就像我只运行一个带有函数“wralot”的线程

0 10000 20000 30000 40000 7 //这里是“setalot”函数 60000 e tc

为什么“setalot”函数不会将所有输出数据更改为 const (7)

4

1 回答 1

1

我想你误解了什么Monitor::Enter。它只是一个合作锁——因为wralot根本不尝试获取锁,所以它的动作setalot不会影响它。目前还不清楚为什么你期望得到一个恒定的输出 7,因为setalot- 如果wralot 确实尝试获得锁,那只是意味着其中一个会“获胜”而另一个将不得不等待。如果wralot必须等待,则setalot在运行时将没有输出,然后wralot会去做它的事情 - 包括在每次迭代时设置j为。i

所以基本上,两个线程都在启动,并且setalot 很快设置j为很多次......与调用7相比,这很可能在计算机术语中眨眼间完成。我建议您在末尾Console.WriteLine添加一个调用,以便您可以看到它何时完成。显然,在那之后,它就完全无关紧要了——这就是为什么你会看到 60000、70000 等。Console::WriteLinesetalot

于 2013-09-28T05:51:31.513 回答