【问题标题】:synchronize function同步功能
【发布时间】:2010-05-12 19:39:49
【问题描述】:

如何在 C# 中使我的函数由互斥信号量保护,也就是 JAVA 中的同步函数

【问题讨论】:

  • 你是要保护函数还是成员数据?
  • 函数,实际上,它是一个写入文件的函数,在尝试执行多重写入时有时会崩溃...

标签: c# .net multithreading synchronization


【解决方案1】:

没有什么好办法,只能自己动手:

private readonly object _locker = new object();

public void MyMethod()
{
    lock (_locker) {
        // Do something
    }
}

【讨论】:

  • 实际上有一个互斥对象;这是个坏主意吗?
  • Mutex 比 lock 慢(Monitor 对象)。它实际上仅用于跨进程通信,我相信使用操作系统内置的互斥锁功能。
【解决方案2】:

您不希望像 Java 这样的同步函数 - 它们不是一个好主意,因为它们使用了其他人可能会干扰的锁结构。你想要的是一个锁对象。基本上,在要保护的类中,创建一个对象类型的私有成员变量

private readonly object lock_ = new object();

然后在你需要同步的任何方法中,使用锁结构自动进入和离开锁:-

public void SomeMethod()
{
    lock(lock_)
    {
         // ...... Do Stuff .........
    }
}

【讨论】:

  • 我以为是这么说的。
  • ...和一个下划线变量名。有一个我以前没见过的约定。
  • 这是释义版 :)
  • 它也不会编译;成员变量上没有数据类型。
  • @John Saunders - 我想我们几乎在同一时间提交了 - 如果你想要荣耀,请告诉我如何传递它。 @Robert Harvey - 我很确定我在审查 Koenig 和 Moo 的 Accelerated C++ 的成员变量的变量名称约定之后得到了下划线。我有点喜欢它,并开始在我自己的代码中使用它。当我们放弃匈牙利语时,它有点卡在我的团队中。我肯定比 m_ 更喜欢它,并且下划线之前是不合法的 C++,我喜欢在任何地方使用相同的约定。
【解决方案3】:

【讨论】:

    【解决方案4】:

    正如 John 所说,您可以使用 lock (),这与 Monitor.Enter 和 Monitor.Exit 相同。如果您需要跨进程互斥体,请使用 Mutex 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多