多线程编程.死锁
来源:互联网 发布:大陆网络公知大v 编辑:程序博客网 时间:2024/05/29 09:13
//from 阿山NET的专栏
多线程编程(4)——死锁
// DeadLockSample.cs
// 分析一下为什么会发生死锁?
using System;using System.Threading;public class Test{ static readonly object firstLock = new object(); static readonly object secondLock = new object(); static void Main() { new Thread(new ThreadStart(ThreadJob)).Start(); // Wait until we're fairly sure the other thread // has grabbed firstLock Thread.Sleep(500); Console.WriteLine ("Locking secondLock"); lock (secondLock) { Console.WriteLine ("Locked secondLock"); Console.WriteLine ("Locking firstLock"); lock (firstLock) { Console.WriteLine ("Locked firstLock"); } Console.WriteLine ("Released firstLock"); } Console.WriteLine("Released secondLock"); } static void ThreadJob() { Console.WriteLine ("/t/t/t/tLocking firstLock"); lock (firstLock) { Console.WriteLine("/t/t/t/tLocked firstLock"); // Wait until we're fairly sure the first thread // has grabbed secondLock Thread.Sleep(1000); Console.WriteLine("/t/t/t/tLocking secondLock"); lock (secondLock) { Console.WriteLine("/t/t/t/tLocked secondLock"); } Console.WriteLine ("/t/t/t/tReleased secondLock"); } Console.WriteLine("/t/t/t/tReleased firstLock"); }}Locking firstLock
Locked firstLock
Locking secondLock
Locked secondLock
Locking firstLock Locking secondLock
因应之道,使用Queue和Monitor:
//QueueMonitorThread.cs
using System;using System.Collections;using System.Threading;public class Test{ static ProducerConsumer queue; static void Main() { queue = new ProducerConsumer(); new Thread(new ThreadStart(ConsumerJob)).Start(); Random rng = new Random(0); for (int i=0; i < 10; i++) { Console.WriteLine ("Producing {0}", i); queue.Produce(i); Thread.Sleep(rng.Next(1000)); } } static void ConsumerJob() { // Make sure we get a different random seed from the // first thread Random rng = new Random(1); // We happen to know we've only got 10 // items to receive for (int i=0; i < 10; i++) { object o = queue.Consume(); Console.WriteLine ("/t/t/t/tConsuming {0}", o); Thread.Sleep(rng.Next(1000)); } }}public class ProducerConsumer{ readonly object listLock = new object(); Queue queue = new Queue(); public void Produce(object o) { lock (listLock) { queue.Enqueue(o); if (queue.Count==1) { Monitor.Pulse(listLock);//通知等待队列中的线程锁定对象状态的更改。 } } } public object Consume() { lock (listLock) { while (queue.Count==0) { Monitor.Wait(listLock);//释放对象上的锁并阻塞当前线程,直到它重新获取该锁。 } return queue.Dequeue(); } }}Producing 0 Consuming 0
Producing 1 Consuming 1
Producing 2 Consuming 2
Producing 3 Consuming 3
Producing 4
Producing 5 Consuming 4
Producing 6 Consuming 5
Consuming 6
Producing 7 Consuming 7
Producing 8 Consuming 8
Producing 9 Consuming 9
- 多线程编程.死锁
- 多线程编程---线程死锁
- iOS 多线程编程 GCD 死锁
- 多线程编程2/锁/死锁
- Java多线程编程之死锁
- Java 多线程 死锁 Java编程思想读书笔记
- python多线程编程(4): 死锁和可重入锁
- python多线程编程(4): 死锁和可重入锁
- Java多线程编程2--同步锁定--死锁
- python多线程编程(4): 死锁和可重入锁
- 多线程编程之线程死锁问题
- java多线程编程核心技术笔记-死锁
- 多线程死锁
- 多线程 - 死锁
- 多线程死锁
- 多线程死锁
- 多线程 死锁
- 多线程死锁
- 为自己庆祝吧
- 调试存储器转储文件
- 我现在明白为什么和尚十两命了
- 防止对 Visual Basic .NET 或 C# 代码进行反相工程
- .NET设计模式之工厂方法模式
- 多线程编程.死锁
- 获取网页的标题
- C# 2.0 泛型
- C# 2.0 匿名方法,迭代器
- C# 2.0 局部类型,空属类型,静态类
- 利用VMWare构建SoftICE调试环境
- C# 2.0 Other & Futrue
- C# 2.0 新迭代器分析
- 管理感悟:革命的目的不是请客吃饭