同步两个方法,避免同时运行

时间:2016-07-22 13:11:32

标签: c# multithreading

class1有两个方法,do1和do2。 它是在同一个应用程序中从多个线程实现的。

我需要使用此规范同步两个方法:

do1只能从1个线程执行,锁定将是一个很好的解决方案。

do2可以同时从多个线程调用但是 在do1运行时无法调用它。

当do1被称为evary线程时必须等待do1的完成才能启动do2。

感谢。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,可以通过简单地使用私有静态锁对象来同步方法来解决问题,这可以通过以下方式完成。

public class c1
{
    private static iLock = new object();

    public void do1()
    {
        lock (iLock)
        {
          // actual method body
        }
    }

    public void do2()
    {
        lock (iLock)
        {
          // actual method body
        }
    }
}

答案 1 :(得分:0)

基本上有两种方法可以实现这一目标。一种是使用信号量,其中一种方法使用一种方法获取所有可用的插槽,另一种方法使用每次执行尝试使用一个插槽。但这有点像黑客,你真正需要的是一个允许独占和非独占锁的同步对象。

这就是ReaderWriterLockReaderWriterLockSlim所做的事情。它们的设计适用于您需要对资源进行独占写访问但对资源具有非独占读访问权的情况,并且适用于这类情况:

ReaderWriterLockSlim m_lock = new ReaderWriterLockSlim();

public string do2()
{
    m_lock.EnterReadLock();
    try
    {
        // Do work, many threads can enter this lock at the same time
    }
    finally
    {
        m_lock.ExitReadLock();
    }
}

public void do1()
{
    m_lock.EnterWriteLock();
    try
    {
        // Do work, only one thread can be in here at once
    }
    finally
    {
        m_lock.ExitWriteLock();
    }
}