首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Monitor::Enter Monitor::Exit锁定线程函数

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

Stack Overflow用户
提问于 2013-09-28 05:44:17
回答 1查看 240关注 0票数 0

我有一个线程类,它有两个函数:

代码语言:javascript
复制
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::Exit块。但是输出就像我只运行了一个函数"wralot“的线程

10000 20000 30000 40000 7/这是"setalot“牌60000 e t.c。

为什么所有输出数据没有被"setalot“函数更改为const (7)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-28 05:51:31

我想你误解了Monitor::Enter的工作。它只是一个协作锁,而且由于wralot根本不试图获得锁,所以setalot的操作不会影响它。还不清楚为什么您期望由于setalot而获得7的恒定输出--如果wralot确实试图获得锁,那就意味着其中一个将“获胜”,而另一个将不得不等待。如果wralot不得不等待,在setalot运行时将没有输出,然后wralot就会执行它的任务--包括在每次迭代时将j设置为i

因此,基本上,两个线程都在启动,setalot非常迅速地将j设置为7很多次.与Console.WriteLine电话相比,这很可能在一眨眼的时间内完成。我建议在Console::WriteLine的末尾添加一个对setalot的调用,这样您就可以看到它什么时候完成了。显然,在那之后,这是完全不相关的--这就是为什么你会看到60000,70000等等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19063739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档