c# - 在多线程中记录冲突
问题描述
我想用这个简单的代码记录多线程中的冲突
public T DataRef
{
get
{
Collisions.DetectAndSaveCollision(typeof(T).ToString(), Sync);
lock (Sync)
{
return _tData;
}
}
set
{
IsInitialized = true;
Collisions.DetectAndSaveCollision(typeof(T).ToString(), Sync);
lock (Sync)
{
_tData = value;
}
}
}
这是在碰撞列表中添加元素的方法
public static void DetectAndSaveCollision(string value, object lockObject)
{
var acquired = false;
try
{
acquired = Monitor.TryEnter(lockObject);
}
finally
{
if (acquired)
{
Monitor.Exit(lockObject);
}
else
{
lock (lockObject)
{
CollisionCollection.Add(Thread.CurrentThread, value);
}
}
}
}
但我不确定它是否没有死锁
解决方案
这是无死锁的,因为最多同时获得一个锁。
正如 Lasse 在评论中指出的那样,这里存在竞争条件,因为您Sync
连续两次获得锁。所以数据不会很准确。如果近似数据对您来说足够了,那么这很好。
您可以通过在获得锁时不立即释放锁来修复比赛。像这样的东西:
var acquiredImmediately = Monitor.TryEnter(...); //test lock
if (!acquiredImmediately) {
Log(...);
Monitor.Enter(...); //retry by blocking
}
CriticalRegion();
Monitor.Exit();
这finally
当然需要保护。
推荐阅读
- javascript - 使用 React Native Webview 添加本地 HTML 和 JS 文件
- python-3.x - 使用问号的正则表达式
- javascript - 如何在组件中调用json数据
- c# - 在基于模板的文档信封上添加签名者
- spring-boot - Spring Boot + Ldap / AD + Kerberos SSO:KrbCryptoException - 校验和失败
- python-3.x - Python 的 ThreadPoolExecutor.submit() 在 windows 和 linux 中的工作方式不同
- python - 如何在pyProgress中按下取消按钮时设置它
- c# - 需要制作一个按钮来保存所有填写的文本框字段,以便我可以在需要时加载
- delphi - 从原始像素数据数组加载 TPicture
- tensorflow - 在神经网络框架中是否有前向映射/扭曲的实现?