Bu yüzden bir ödev için C# -Lock kullanma veya kendi kendine uygulanan bir TaS-Lock kullanma seçeneğine sahip olmamız gerekir. TaS-Locks hakkında okuduğum şey, bir değeri okumak ve yazmak için 1 atomik adım kullanmasıdır. Bunun için C# 'daki Interlocked sınıfını kullanmamız önerildi.C# 'da kendi TaS-Lock'umu nasıl uygularım?
Şimdiye kadar bu bende ne, ama tutarsız yanıtlar sonuçlanıyor gibi görünmektedir:
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);
}
}
bilen var mı yanlış burada ne yapıyorum?
Düzenleme: Aşağıdaki bunu değiştirdik
: Kevin cevap olarak
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);
}
}
Ancak bu hala tutarsız sonuçlar verir.
Düzenleme # 2: C# kilidine değişiklikler:
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);
}
}
yaptığı -in sınıf
SpinLock
. Kilit zaten alınmışsa değeri değiştiremezsiniz –Bu bir üniversite ödevi mi yoksa yaptığınız bir ders mi? Merak ediyorum :) – vtortola
@vtortola Kolej ödevin bir parçası. – Heijmaaans