使用Monitor :: Enter Monitor :: Exit锁定线程函数

时间:2013-09-28 05:44:17

标签: multithreading c++-cli command-line-interface

我有一个包含两个函数的线程类:

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 t.c。

为什么所有输出数据都不会被“setalot”func

更改为const(7)

1 个答案:

答案 0 :(得分:1)

我认为你误解了Monitor::Enter的作用。它只是一个合作锁 - 而且wralot根本没有尝试获取锁,setalot的动作不会影响它。由于setalot,如果wralot 尝试获取锁定,那么为什么你期望获得7的恒定输出并不是很清楚,这只是意味着其中一个会“赢”而另一个则必须等待。如果wralot必须等待,setalot正在运行时就没有输出,然后wralot将继续执行此操作 - 包括将j设置为i每次迭代都会。

所以基本上,两个线程都在启动,并且setalot 非常快j设置为7很多次......这很可能在与Console.WriteLine电话相比,电脑方面的转瞬即逝。我建议你在Console::WriteLine的末尾添加一个setalot来电,这样你就可以看到它何时结束。显然,在那之后,它完全无关紧要 - 这就是为什么你会看到60000,70000等。