割り当てのために、C#-Lockを使用するか、または自己実装されたTaS-Lockを使用するオプションが必要です。私がTaS-Locksについて読んだことは、1つのアトムステップを使用して値を読み書きすることです。このために、C#でInterlockedクラスを使用することが提案されました。C#で自分のTaS-Lockを実装するにはどうしたらいいですか?
は、これまでのところ、これは私が持っているものであるが、矛盾した答えになるようだ:
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);
}
}
誰も私が間違ってここにやっている知っていますか?
編集:私は次のようにそれを変更しました
:ケビンに対する応答として
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);
}
}
は、しかし、これはまだ一貫性のない結果を返します。
編集#2:C#のロックに変更:
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);
}
}
Exchangeではなく、Lock()でCompareExchangeを使用する必要があります。ロックが既に取られている場合は値を変更しないでください –
これはカレッジの課題ですか、あなたがやっているコースですか?私は不思議です:) – vtortola
@vtortolaそれは大学の課題の一部です。 – Heijmaaans