同步两种方法并避免同时运行

本文关键字:运行 两种 方法 同步 | 更新日期: 2023-09-27 17:58:10

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

我需要用这个规格同步两种方法:

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

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

调用do1时,evary线程必须等待do1完成后才能启动do2。

谢谢。

同步两种方法并避免同时运行

基本上有两种方法可以实现这一点。一种是带有一个方法的Semaphore,该方法使用一个方法占用所有可用的插槽,另一种方法每次执行尝试使用一个插槽。不过,这有点像黑客,你真正需要的是一个允许独占和非独占锁的同步对象。

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();
    }
}

如果我正确理解了这个问题,那么只需使用私有静态锁对象来同步方法就可以解决这个问题,具体操作如下。

public class c1
{
    private static iLock = new object();
    public void do1()
    {
        lock (iLock)
        {
          // actual method body
        }
    }
    public void do2()
    {
        lock (iLock)
        {
          // actual method body
        }
    }
}