В зависимости от входной переменной, передаваемой программе через командную строку, я хочу использовать разные блокировки (для школьного упражнения по параллелизму).Я хочу переключиться между сборкой в C # lock и моей собственной реализацией TaS.
Реализация TaS взята из " Как мне реализовать свой собственный TaS-Lock в 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);
}
}
В настоящее время я могу думать только о переключении между оператором блокировки и моей собственной реализацией блокировки:
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++;
}
}
}
Мне интересно, может ли встроенный оператор блокировки использоватьсобственные реализации блокировок или другие способы сделать это, , потому что я не думаю, что это правильный путь.Еще одна вещь, о которой я подумал, это переписать способ, которым встроенная блокировка C # была реализована в классе, и позволить этому классу и моему классу Tas_Lock наследовать один и тот же интерфейс (ILock), а затем инициализировать переменную ILock как один из обоих классов (как в вопросеприлагается).Мои проблемы с этим подходом заключаются в том, что в упражнении говорится об использовании оператора build in lock, а также кажется, что нужно заново изобретать колесо.