如何在C#锁定和自己的锁定实现之间进行切换

时间:2018-11-26 20:12:15

标签: c# multithreading locking

根据通过命令提示符提供给程序的输入变量,我想使用不同的锁(用于并发性的学校练习)。我想在C#锁构建和我自己的TaS实现之间切换。

TaS实施来自“ How do I implement my own TaS-Lock in C#?”:

public class Tas_Lock
{
    int L = 0;

    public void Lock()
    {
        while (0 != Interlocked.CompareExchange(ref L, 1, 0)) { }
    }

    public void Unlock()
    {
        Interlocked.Exchange(ref L, 0);
    }
}

我目前想到的唯一方法就是在lock语句和我自己的lock实现之间切换:

object obj = new object();
int counter = 0;
bool useOwnImplementation = true; //or false depending on input
Tas_Lock ownLock = new Tas_Lock();

//multiple threads that run simultaneously and call incrementGlobalCounter

incrementGlobalCounter() {
  if (useOwnImplementation) {
    ownLock.Lock();
    counter++;
    ownLock.Unlock();
  } else {
    lock (obj) {
         counter++;
    }
  }
}

我想知道内置的lock语句是否可以使用自己的锁实现或其他实现方法,,因为我认为这不是正确的方法。我想到的另一件事是重写在类中实现C#的内置锁的方式,然后让该类和我的Tas_Lock类继承相同的Interface(ILock),然后将ILock变量初始化为两个类之一(例如在问题中提供)。我对此方法的担心是,该练习表明要使用build in lock语句,而且看起来也像是在重新发明轮子。

0 个答案:

没有答案