死锁的产生与检测
程序员文章站
2022-04-17 14:36:43
...
产生死锁
在操作系统中,我们可能接触过两个进程争抢资源,互不相让,然后产生了死锁,这时候,我们可以用银行家算法来分配资源。下面,我们先模拟产生死锁:
#region 试图产生死锁的代码
// static void T1(Program p)
//{
// //主线程占有了mainRes并试图访问workerRes;
// lock (p.mainRes)
// {
// Thread.Sleep(10);//
// lock (p.workerRes) //死锁
// {
// Console.WriteLine(p.workerRes.Data);
// }
// }
//}
// void T2()
//{
// //工作线程占有了workerRes,并试图访问mainRes;
// lock (workerRes)
// {
// Thread.Sleep(10);
// lock (mainRes)
// {
// Console.WriteLine(mainRes.Data);
// }
// }
//}
#endregion
检测死锁
为了检测死锁,我们改进如上代码:
namespace 死锁
{
//资源
public class Resource {
public string Data;
}
class Program
{
private Resource mainRes = new Resource() { Data = "mainRes" };
private Resource workerRes = new Resource() { Data = "workerRes" };
static void Main(string[] args)
{
Thread.CurrentThread.Name = "main ";
Program p = new Program();
Thread worker = new Thread(p.T2);
worker.Name = "worker";
worker.Start();
T1(p);
}
#region 使用Monitor.TryEnter方法——对可能产生死锁的位置进行检测
static void T1(Program p) {
lock (p.mainRes )
{
Thread.Sleep(10);
int i = 0;
while (i<3)
{
if (Monitor.TryEnter (p.workerRes ))
{
Console.WriteLine(p.workerRes .Data);
Monitor.Exit(p.workerRes );
break;
}
else
{
Thread.Sleep(1000);//1秒后重试
}
i++;
}
if (i==3)
{
Console.WriteLine("{0}:tried 3 times,deadlock",Thread.CurrentThread .Name);
}
}
}
void T2() {
lock (workerRes)
{
Thread.Sleep(10);
int i = 0;
while (i < 3)
{
if (Monitor.TryEnter(mainRes ))
{
Console.WriteLine(mainRes .Data );
Monitor.Exit(mainRes);
break;
}
else
{
Thread.Sleep(1000);//1秒后重试
}
i++;
}
if (i == 3)
{
Console.WriteLine("{0}:tried 3 times,deadlock", Thread.CurrentThread.Name);
}
}
}
#endregion
}
}
如上代码,我们可以使用Monitor.TryEnter方法来对程序中可能产生死锁的位置进行检测。
推荐阅读
-
网站安全检测 针对于手机短信轰炸漏洞的检测与修复办法
-
linux 可执行文件与写操作的同步问题(文件读写操作产生的锁机制)
-
APP渗透测试 对文件上传功能的安全检测与webshell分析
-
任意调整下划线与字体距离并取消回车后自动产生的编号
-
UTF-8 编码中BOM的检测与删除
-
3DMAX的特效制作实例:车轮胎与地面磨擦产生出痕迹的效果
-
网站漏洞检测之用户密码找回网站漏洞的安全分析与利用
-
Python 爬虫 + 人脸检测会产生什么样的化学反应?简直不可思议!
-
oninput、onchange与onpropertychange事件的区别, 与input输入框实时检测
-
sqlserver的表变量在没有预估偏差的情况下,与物理表可join产生的性能问题