首页 / C# / c# – 为什么这段代码不会以死锁结束
c# – 为什么这段代码不会以死锁结束
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 为什么这段代码不会以死锁结束,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1348字,纯文字阅读大概需要2分钟。
内容图文
![c# – 为什么这段代码不会以死锁结束](/upload/InfoBanner/zyjiaocheng/766/393238f2e1b9445c8132e89043eb5a83.jpg)
我有这个C#代码:
public class Locking
{
private int Value1; private int Value2;
private object lockValue = new Object();
public int GetInt1(int value1, int value2)
{
lock (lockValue)
{
Value1 = value1;
Value2 = value2;
return GetResult();
}
}
public int GetInt2(int value1, int value2)
{
lock (lockValue)
{
return GetInt1(value1, value2);
}
}
private int GetResult()
{
return Value1 + Value2;
}
}
所以基本上我期望一个死锁,如果我执行GetInt2但代码只是执行.任何好的解释.
解决方法:
这里的一般情况是同步对象是否可重入.换句话说,如果已经拥有锁,则可以通过相同的线程再次获取.另一种说法是对象是否具有“线程亲和力”.
在.NET中,Monitor类(实现lock语句),Mutex和ReaderWriterLock是可重入的. Semaphore和SemaphoreSlim类不是,您可以使用二进制信号量使代码死锁.实现锁定的最便宜的方法是使用Interlocked.CompareExchange(),它也不会重入.
使同步对象可重入需要额外的成本,它需要跟踪哪个线程拥有它以及在拥有线程上获取锁的频率.这需要存储Thread.ManagedId和一个计数器,两个整数.这影响了C中的选择,例如,C 11语言规范最终将线程添加到标准库. std :: mutex类在该语言中不可重入,并且拒绝添加递归版本的提议.他们考虑了使其重入过高的开销.也许有点笨手笨脚,花费在调试意外死锁上花费的时间相当微不足道的成本:)但它是一种语言,它不是灌篮,获得线程ID可以保证像它一样便宜.净.
这在ReaderWriterLockSlim类中公开,您可以选择.请注意RecursionPolicy属性,允许您在NoRecursion和SupportsRecursion之间进行选择. NoRecursion模式更便宜,而且非常纤薄.
内容总结
以上是互联网集市为您收集整理的c# – 为什么这段代码不会以死锁结束全部内容,希望文章能够帮你解决c# – 为什么这段代码不会以死锁结束所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。