Tak więc dla zadania musimy mieć możliwość skorzystania z C# -Lock lub użyć samouruchomionego TaS-Lock. To, co przeczytałem na temat TaS-Locks, polega na tym, że używa 1 kroku atomowego do czytania i pisania wartości. Zasugerowano nam, że używamy klasy Interlocked w C# do tego.Jak mogę wdrożyć własną blokadę TaS w języku C#?
Jak dotąd jest to, co mam, ale wydaje się, aby doprowadzić do niespójnych odpowiedzi:
public interface Lock
{
void Lock();
void Unlock();
}
public class C_Sharp_Lock : Lock
{
readonly Object myLock = new object();
public void Lock()
{
Monitor.Enter(myLock);
}
public void Unlock()
{
Monitor.Exit(myLock);
}
}
public class Tas_Lock : Lock
{
int L = 0;
public void Lock()
{
while (0 == Interlocked.Exchange(ref L, 1)) { };
}
public void Unlock()
{
Interlocked.Exchange(ref L, 0);
}
}
Czy ktoś wie, co robię źle tutaj?
Edit: W odpowiedzi na Kevin:
Zmieniłem ją na następujące kwestie:
public class Tas_Lock : Lock
{
int L = 0;
public void Lock()
{
while (0 == Interlocked.CompareExchange(ref L, 1, 0)) { };
}
public void Unlock()
{
Interlocked.Exchange(ref L, 0);
}
}
Jednak to wciąż powraca niespójnych wyników.
Edit # 2: Zmiany w C# blokady:
public class C_Sharp_Lock : Lock
{
readonly Object myLock = new object();
bool lockTaken = false;
public void Lock()
{
Monitor.Enter(myLock, ref lockTaken);
}
public void Unlock()
{
if (lockTaken)
Monitor.Exit(myLock);
}
}
Musisz użyć polecenia Porównaj w 'Zablokuj()', a nie w Exchange. Nie możesz zmienić wartości, jeśli blokada jest już zajęta. –
Czy jest to zadanie na uczelni lub z kursu, który robisz? Jestem ciekawy :) – vtortola
@vtortola Jest to część zadania na uczelni. – Heijmaaans