锁定两个方法并确保仅在线程上调用一个方法

时间:2016-10-12 07:08:02

标签: c# multithreading locking

在课堂上,我有两种方法:

  • Method1():void
  • Method2():void

这个类可以被多个线程访问。 我怎么能意识到,如果" thread1"打电话"方法1"," thread2"正在等待"方法2"或者在" Method1"。如果" thread2"这个逻辑也应该有用。正在调用"方法2",即" thread1"等待"方法1"或"方法2"

我的想法是:

private object _lock = new object();

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

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

这会有用吗?

5 个答案:

答案 0 :(得分:1)

在您的评论澄清后,您的代码将有效。

使用给定的代码,您将:

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

    换句话说,这是死锁:

    lock (x)
        lock (x)
            ....
    
  3. 所以你的代码应该可以正常工作。

答案 1 :(得分:0)

你不能在同一个对象上做,你可以使用Monitor。监控允许重新入侵

答案 2 :(得分:0)

您可以使用AutoResetEvent的WaitOne()函数,只允许一个函数一次访问资源,当它完成时称为Set()。

此处示例:Synchronizing two threads with AutoResetEvent

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

  

如果“thread1”调用“Method1”,“thread2”在“Method2”或“Method1”中等待,我怎么才能意识到?如果“thread2”调用“Method2”,“thread1”在“Method1”或“Method2”中等待

,这个逻辑也应该有效。

逻辑可行。但不确定你在这里问的是什么。