多线程和死锁

时间:2009-03-28 09:27:33

标签: c# .net vb.net

在哪些情况下,我们可以执行多线程和死锁概念。可举一些例子

3 个答案:

答案 0 :(得分:3)

多线程基本上是使用线程,它们是某些可以访问进程中相同内存空间的实体,可以同时运行进程的不同部分。

但是,并发编程很难,很复杂,也很危险。 死锁是由此产生的危险之一,这意味着两个线程正在等待彼此完成任务,最终成为一个锁。假设你在给我5美元之前等你给你5美元,我也是这样做的。我们都在等待彼此,因此什么都不会发生。

就像我说的,这是一个非常复杂的主题,绝对不是可以在这里回答一个问题的东西。我建议你做一些研究,找到有用的资源,这些资源可以帮助你更牢固地掌握并发编程的概念。

答案 1 :(得分:1)

假设您在询问多线程环境中是如何发生死锁的。

假设我们有两个线程和两个资源,时间线是这样的:

+===+============================+============================+
| # | Thread 1                   | Thread 2                   |
+===+============================+============================+
| 1 | Allocate resource A, okay. |                            |
+---+----------------------------+----------------------------+
| 2 |                            | Allocate resource B, okay. |
+---+----------------------------+----------------------------+
| 3 | Allocate resource B, lock. |                            |
+---+----------------------------+----------------------------+
| 4 |                            | Allocate resource A, lock. |
+===+============================+============================+

现在你有两个线程被锁定,每个线程都在等待一个永远不会被释放的资源,因此会死锁。

无法释放资源的原因是因为只能释放资源的线程被锁定。这就是为什么总是让你的线程按照彼此相同的顺序分配资源是个好主意。

答案 2 :(得分:1)

您通常会获得使用BackgroundWorker组件实现线程的建议。这是导致它死锁的一个例子:

private void button1_Click(object sender, EventArgs e) {
  backgroundWorker1.RunWorkerAsync();
  // Do something while the BGW runs
  //...
  System.Threading.Thread.Sleep(500);
  // Wait for the result to be available
  while (backgroundWorker1.IsBusy)
    System.Threading.Thread.Sleep(10);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
  // Do some work
  //...
  System.Threading.Thread.Sleep(1000);  // Pretend to do some work
  e.Result = 42;
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
  // Store the result...
}

发生死锁是因为BGW必须在完成之前调用RunWorkerCompleted事件。在UI线程空闲之前不会发生这种情况。这里没有发生,它停留在等待BGW完成的循环中。

举个例子,有很多方法可以像这样陷入麻烦。