使用Monitor :: Enter锁定Monitor :: Exit锁定线程功能

用户名

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

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)

乔恩·斯基特

我认为您误解了Monitor::Enter它只是一个协作锁-wralot根本不尝试获取该锁,所以操作setalot不会对其产生影响。目前尚不清楚,为什么由于以下原因而期望获得恒定的输出7-setalot如果wralot 确实尝试获得锁,则仅意味着其中一个将“获胜”,而另一个将不得不等待。如果wralot必须等待,则setalot运行时将没有任何输出,然后wralot继续执行操作-包括在每次迭代时都设置ji

所以基本上,两个线程开始,并setalot 很快j7了很多次......这可能在计算机方面的瞬息完成,具有比较Console.WriteLine调用。我建议您Console::WriteLine在的末尾添加一个呼叫setalot以便您可以看到通话结束的时间。显然在那之后,它是完全不相关的-这就是为什么您看到60000、70000等的原因。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Clojure中的Java锁定宏或monitor-enter和monitor-exit

来自分类Dev

使用Monitor进入/退出,等待/脉冲,锁定的多线程

来自分类Dev

Monitor.TryEnter检查对象是否已锁定?

来自分类Dev

Monitor.TryEnter检查对象是否已锁定?

来自分类Dev

使用await时Monitor.Exit上的SynchronizationLockException

来自分类Dev

WPF表单使用后台线程锁定

来自分类Dev

如何使用ReentrantLock或Mutex正确锁定线程?

来自分类Dev

使用CRITICAL_SECTION锁定/解锁功能

来自分类Dev

Monitor.Enter如何工作?

来自分类Dev

Monitor.Enter如何工作?

来自分类Dev

C#Monitor.Enter SynchronizationLockException

来自分类Dev

如何获得访问或线程锁定的功能失败的等待时间?

来自分类Dev

线程安全的缓存枚举器-使用yield锁定

来自分类Dev

使用C#中的lock()锁定线程访问的对象

来自分类Dev

线程安全:锁定与参考

来自分类Dev

基于值的线程锁定

来自分类Dev

Erlang NIF:线程锁定

来自分类Dev

锁定GLSurfaceView线程

来自分类Dev

如何管理Monitor.Enter的执行顺序

来自分类Dev

锁定Postgres功能

来自分类Dev

锁定功能层次结构

来自分类Dev

反向代理锁定功能

来自分类Dev

如何锁定功能?

来自分类Dev

锁定功能层次结构

来自分类Dev

即使使用了线程池,Android Cordova插件也会锁定UI线程

来自分类Dev

多线程锁定要求

来自分类Dev

锁定多线程热插拔

来自分类Dev

如何从线程锁定函数访问

来自分类Dev

C#锁定线程问题