- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
因此,对于一项任务,我们需要选择使用 C#-Lock 或使用自行实现的 TaS-Lock。我读到的有关 TaS-Locks 的内容是,它使用 1 个原子步骤来读取和写入值。有人建议我们为此使用 C# 中的 Interlocked 类。
到目前为止,这就是我所得到的,但它似乎导致了不一致的答案:
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);
}
}
最佳答案
您误解了 Interlocked.CompareExchange
的工作方式。如果它之前等于提供的比较对象,它会自动交换一个值,并返回之前的值。
简而言之,Interlocked.CompareExchange(ref L, 1, 0)
将:
从那里开始,您应该做的是循环 until Interlocked.CompareExchange
返回 0(这意味着已获取锁)。在您的代码中,您正在等待而 Interlocked.CompareExchange
返回 0。
固定代码:
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);
}
}
需要注意两点:
Unlock
中的 Interlocked.Exchange
可以替换为更快的 Volatile.Write
(或者甚至是简单的写入,尽管有争议) SpinLock
,它已经以优化的方式完成了所有这些工作关于c# - 如何在 C# 中实现我自己的 TaS-Lock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40871859/
我目前正在尝试将 java applet 与我正在构建的 ASP.NET 站点集成.. 该小程序基于thinkmap SDK框架构建.. 小程序成功启动,但抛出有关数据配置文件的错误。 Fatal E
因此,对于一项任务,我们需要选择使用 C#-Lock 或使用自行实现的 TaS-Lock。我读到的有关 TaS-Locks 的内容是,它使用 1 个原子步骤来读取和写入值。有人建议我们为此使用 C#
因此,出于某种原因,我无法理解为什么 Test and Test and Set 函数比标题中提到的书中的 Test and set 函数运行得更快的完整概念。让我详细说明...... 在附录中的上述
我是 Azure 和 TAS ( https://tanzu.vmware.com/application-service ) 的新手,希望在 Azure 上使用 VMWare Tanzu TAS(以
我是一名优秀的程序员,十分优秀!