【问题标题】:Locking two methods and ensure that only on thread is calling one method锁定两个方法并确保只有在线程上调用一个方法
【发布时间】:2016-10-12 07:08:02
【问题描述】:

在一个类中我有两种方法:

  • Method1(): 无效
  • Method2(): 无效

这个类可以被多个线程访问。 我怎样才能意识到,如果“thread1”调用“Method1”,“thread2”正在“Method2”或“Method1”中等待。这个逻辑也应该起作用,如果“thread2”正在调用“Method2”,那么“thread1”正在“Method1”或“Method2”中等待

我的想法是这样的:

private object _lock = new object();

void Method1() {
 lock(_lock){
  //TODO: do something
 }
}

void Method2() {
 lock(_lock){
  //TODO: do something
 }
}

这行得通吗?

【问题讨论】:

  • 您想知道是否有其他线程正在等待,或者您想确保在任何给定时间只有一个线程可以运行任一方法?跨度>
  • 我想确保只有一个线程可以运行这两种方法。
  • 那你的方法没问题。

标签: c# multithreading locking


【解决方案1】:

在您在 cmets 中澄清后,您的代码将起作用。

使用给定的代码,您将:

  1. 确保只有一个线程可以同时执行任一 Method1Method2
    1. 如果一个线程在Method1 内,其他线程在尝试调用Method1Method2 时将等待。
  2. 如果Method1 调用Method2 或反之亦然,这也将起作用,因为同一个线程可以多次锁定同一个对象。

    换句话说,这不是死锁:

    lock (x)
        lock (x)
            ....
    

所以你的代码应该可以正常工作。

【讨论】:

    【解决方案2】:

    你不能对同一个对象做,你可以使用监视器。监视器允许重入

    【讨论】:

    • 那么,使用“监视器”我可以确保只有在线程上才能运行这两种方法中的任何一种?
    • lock() 是 syntactic sugar for Monitor,但为您编写了 Monitor.Exit 代码。
    【解决方案3】:

    您可以使用 AutoResetEvent 的 WaitOne() 函数,在调用 Set() 完成后,一次只允许一个函数访问资源。

    此处示例:Synchronizing two threads with AutoResetEvent

    MSDN 参考:https://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v=vs.110).aspx

    【讨论】:

      【解决方案4】:

      您的方法应该是同步的。请参阅 C# version of java's synchronized keyword? 以了解如何在 c# 中执行此操作。

      【讨论】:

        【解决方案5】:

        这会奏效。由于您锁定的是同一个对象,因此在给定时间只会执行一个 lock { } 块。

        如果“thread1”调用“Method1”,我怎么知道“thread2”正在“Method2”或“Method1”中等待。这个逻辑也应该起作用,如果“thread2”正在调用“Method2”,那么“thread1”正在“Method1”或“Method2”中等待

        逻辑会起作用。但不确定你想在这里问什么。

        【讨论】:

          猜你喜欢
          • 2012-11-01
          • 2012-07-17
          • 1970-01-01
          • 2013-10-18
          • 1970-01-01
          • 2016-10-18
          • 2020-07-07
          相关资源
          最近更新 更多