Monitor问题

xiaohu9711 2009-12-29 09:21:28
为什么我在线程中使用Monitor。exit()时出错。假设f为主线程中定义的类型。
Monitor.Enter(f);
this.f++;
Monitor.Exit(f);
...全文
112 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jiacker 2009-12-29
  • 打赏
  • 举报
回复
看样子f是值类型的,请看MSDN关于Monitor的备注:

使用 Enter 获取作为参数传递的对象上的 Monitor。如果其他线程已对该对象执行了 Enter,但尚未执行对应的 Exit,则当前线程将阻止,直到对方线程释放该对象。同一线程在不阻止的情况下多次调用 Enter 是合法的;但在该对象上等待的其他线程取消阻止之前必须调用相同数目的 Exit。

使用 Monitor 锁定对象(即引用类型)而不是值类型。将值类型变量传递给 Enter 时,它被装箱为对象。如果再次将相同的变量传递给 Enter,则它被装箱为一个单独对象,而且线程不会阻止。Monitor 本应保护的代码未受保护。此外,将变量传递给 Exit 时,也创建了另一个单独对象。因为传递给 Exit 的对象和传递给 Enter 的对象不同,Monitor 将引发 SynchronizationLockException。有关详细信息,请参见概念主题 监视器

Interrupt 可以中断正等待进入对象的 Monitor 的线程。将引发 ThreadInterruptedException。

使用 C# try…finally 块(在 Visual Basic 中为 Try…Finally)来确保释放监视器,或使用以 try…finally 块包装 Exit 方法的 C# lock 语句(在 Visual Basic 中为 SyncLock)。
xiaohu9711 2009-12-29
  • 打赏
  • 举报
回复
错误:从不同步的代码块中调用了对象同步方法。

如果不用monitor那我用什么来确保共享变量的互斥呢?
xiaohu9711 2009-12-29
  • 打赏
  • 举报
回复
不是完整版?那怎么可以使用enter呢?

bright3345 2009-12-29
  • 打赏
  • 举报
回复
是不是该你使用的软件不是完整版,没有包括这个函数,或者是程序定义的问题,有重复构造?
xiaohu9711 2009-12-29
  • 打赏
  • 举报
回复
:(

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧