什么情况下出现死锁???(线程)

l171147904 2010-04-29 04:22:17
1,什么情况下出现死锁
2,以下代码 如何完善更好!
struct MyData
{
public string ip;
public string part;
public string time;
}
public void A()
{
Ds //数据源
foreach(DataRow dr in Ds.Tables[0].Rows)
{
MyData md = new MyData();
md.ip = dr["ip"].ToString();
md.part= dr["part"].ToString();
md.time= dr["time"].ToString();
ThreadPool.QueueUserWorkItem(new WaitCallback(JanitorMethod), md); //线程池
}
}

private Object lockObj = new Object();
private void JanitorMethod(object ob)
{

MyData de_All = (MyData)ob;
Thread.Sleep(Convert.ToInt32(de_All.time));
lock (lockObj)
{

try
{
SocketService ss = new SocketService(de_All.ip, de_All.part, false);
StringBuilder sb = new StringBuilder("12312313");
ss.Write_DoWork(sb.ToString()); // 执行函数不用理睬
}
catch (Exception err)
{
throw err;
}

}
}
...全文
800 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
bychgh 2010-05-04
  • 打赏
  • 举报
回复
帮顶~~~~~~~·
灵雨飘零 2010-05-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 gp3422007013 的回复:]
学习,帮顶..............
[/Quote]
en
beijingbeerman 2010-05-04
  • 打赏
  • 举报
回复
要所在try里面
try
{
lock (this)
{
。。。。。。。。。。。。
}
}

互锁:
第一个线程没有释放,等待第二个线程资源。第二个线程也锁着,等待第一线程资源。
wenbin 2010-05-02
  • 打赏
  • 举报
回复
lock 是互斥锁
当锁同一个对象时,是不会出现死锁的情况。

至于没锁住的情况,可能是其它的原因。可以写下测试代码试下。
好像你在 lock (lockObj)
{

try
{
SocketService ss = new SocketService(de_All.ip, de_All.part, false);
StringBuilder sb = new StringBuilder("12312313");
ss.Write_DoWork(sb.ToString()); // 执行函数不用理睬
}
catch (Exception err)
{
throw err;
}

}
地方加锁不能反映你的目的,de_All这个对象,每一个都不一样。无需加锁。
ss.Write_DoWork(sb.ToString());这里要锁的话,那么在这里面锁可能代码更清晰些。
sunny200808 2010-05-02
  • 打赏
  • 举报
回复
从概念上来讲,死锁的产生由1资源不足,2进程间不正当竞争引起的
songfei5201314 2010-05-02
  • 打赏
  • 举报
回复
有项目管理经验的.NET开发的朋友,可以加上限500人的QQ群28720769,一起交流。
gp3422007013 2010-05-02
  • 打赏
  • 举报
回复
学习,帮顶..............
studentliudong 2010-04-29
  • 打赏
  • 举报
回复
学习~帮顶
段传涛 2010-04-29
  • 打赏
  • 举报
回复
单单 死锁来说 你的代码不会 的 不要小看 了 .net 的 GC(clr)
对于 你用锁的目的 不理解 try 和锁并用 ?
你是 锁 throw ?
我再看看
qiqishardgel 2010-04-29
  • 打赏
  • 举报
回复
只能帮顶了!
fenglm999 2010-04-29
  • 打赏
  • 举报
回复
我只是从代码里面看你的md,有可能出现这种情况,主线程的for在给md对象赋值,而threadpool中却还在占有md,还有你报的错是什么错误,你for里面会不会大于线程池的上届
porschev 2010-04-29
  • 打赏
  • 举报
回复
多线程同时会出现死锁。。。

只让一个执行。。应该就不会。。
l171147904 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lee_b 的回复:]
一般如果你几个线程并发执行的时候,
如果没有同时对某个资源进行访问时是不会出现死锁的。
[/Quote]

几个线程并发执行,都执行函数:JanitorMethod, 并访问MyData

概率高的不行。。。按你的理论,干脆别锁了!
锁的作用就阻止别的线程进入(它们等待),直到释放锁的对象,其他线程进入执行。
lee_b 2010-04-29
  • 打赏
  • 举报
回复
一般如果你几个线程并发执行的时候,
如果没有同时对某个资源进行访问时是不会出现死锁的。
cyhf00808 2010-04-29
  • 打赏
  • 举报
回复
学习,帮顶
l171147904 2010-04-29
  • 打赏
  • 举报
回复
顶着有分,分不够再加!!!

LOCK 写是写了,可 没锁住 : Thread.Sleep(Convert.ToInt32(de_All.time));

也不知道 什么情况下会死锁!

或 换个写法效率更好!

或 锁还有问题
PeterSong9970 2010-04-29
  • 打赏
  • 举报
回复
学习。。。
messi_yang 2010-04-29
  • 打赏
  • 举报
回复
幫頂哈咯···
Peter200694013 2010-04-29
  • 打赏
  • 举报
回复
帮顶
lee_b 2010-04-29
  • 打赏
  • 举报
回复
顶咯,学习,你不是写lock了么

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧