c# - .net 中的死锁示例?

标签 c# visual-studio-2008 multithreading deadlock

任何人都可以用 c# 给出一个简单的死锁示例代码吗?并请告诉您在 C# 代码示例中查找死锁的最简单方法。 (可能是检测给定示例代码中死锁的工具。)

注意:我有 VS 2008

最佳答案

一种常见的方法是,如果您有嵌套的锁,这些锁不是以相同的顺序获取的。线程 1 可以获得锁 A,线程 2 可以获得锁 B,它们会死锁。

var a = new object();
var b = new object();

lock(a) {
   lock(b) {

   }
}

// other thread
lock (b) { 
  lock(a) {

  }
}

编辑:非锁定示例 .. 使用等待句柄。假设苏格拉底和笛卡尔正在吃牛排,他们都是彬彬有礼的哲学家,需要一把 fork 和一把刀才能吃饭。然而,他们只有一套银器,所以每个人都可以拿一个餐具,然后永远等待另一个人交出他们的餐具。

参见 Dining Philosopher's Problem

WaitHandle fork = new AutoResetEvent(), knife = new AutoResetEvent();

while(Socrates.IsHungry) {
   fork.WaitOne();
   knife.WaitOne();
   Eat();
   fork.Set();
   knife.Set();
} 

// other thread
while(Descartes.IsHungry) {
   knife.WaitOne();
   fork.WaitOne();
   Eat();
   knife.Set();
   fork.Set();
} 

关于c# - .net 中的死锁示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2543140/

相关文章:

javascript - 用户控件中的 VS2008 javascript 调试器

c# - 多线程线程安全读/写锁定的最佳 C# 解决方案?

c# - 如何向从 MVC3 Razor View 调用的函数添加 <T> 类型参数?

c++ - 即使重载 = 运算符也无法生成赋值运算符

c# - 在 C# 中,分贝的幅度总是返回 NaN

c++ - 如何/在哪里获取 msvs 2008(32 位)编译器工具链的编译器而不安装 msvs2008

python - 线程轮询 sqs 并将其添加到 python 队列中以处理模具

c - 线程间setjmp/longjmp处理超时

c# - LINQ to XML 绑定(bind)到 asp.Net DropDownList

c# - 如何等待一个方法在另一个线程上完成?