(200分)关于线程锁的问题!!!谢谢

l171147904 2010-04-20 09:50:57
struct MyData
{
public string TAG_ID; //数据
public string val; //数据
public string time; //延迟时间
}

public string LinkageFunction(string tagID) //返回 0:联动失败; 1:联动成功!
{
DataSet ds_SCENE = //取的数据集
if (ds_SCENE != null && ds_SCENE.Tables.Count > 0 && ds_SCENE.Tables[0].Rows.Count > 0)
{
int coun = ds_SCENE.Tables[0].Rows.Count;

for (int i = 0; i < coun; i++)
{
MyData de = new MyData();
de.TAG_ID = ds_SCENE.Tables[0].Rows[i]["TAG_ID"].ToString();
de.val = ds_SCENE.Tables[0].Rows[i]["LINK_ROLE_VAL"].ToString();
de.time = ds_SCENE.Tables[0].Rows[i]["LINK_ROLE_TIME"].ToString();
ThreadPool.QueueUserWorkItem(new WaitCallback(JanitorMethod), de); //线程池
}
}

private void JanitorMethod(object ob)
{
MyData de_All = (MyData)ob;
Thread.Sleep(Convert.ToInt32(de_All.time));
try
{
//执行操作 }
catch (Exception err)
{
throw err;
}
}

1,我这代码是否存在安全问题?
2,若需要上 线程锁?我该锁哪里? lock(de_All)?lock(ob)或其他位置?
3,死锁问题会存在?

初入线程安全,,,谢谢解答!

原帖http://topic.csdn.net/u/20100324/17/0b293992-7368-43e6-803b-2ba11c92d522.html
...全文
204 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
louti 2010-04-20
  • 打赏
  • 举报
回复
关注 帮顶 说的200其实是100
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
1,我这代码是否存在安全问题?
------------------------
存在

2,若需要上 线程锁?我该锁哪里? lock(de_All)?lock(ob)或其他位置?
-----------------------
修改如下函数:private void JanitorMethod(object ob)
{
MyData de_All = (MyData)ob;
Thread.Sleep(Convert.ToInt32(de_All.time));
try
{
//执行操作 }
catch (Exception err)
{
throw err;
}
}
-------------
改为如下:

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
{
//执行操作
}
catch (Exception err)
{
throw err;
}
}
}


3,死锁问题会存在?
lee_b 2010-04-20
  • 打赏
  • 举报
回复
来顶下先。。
yuanhuiqiao 2010-04-20
  • 打赏
  • 举报
回复
》1,我这代码是否存在安全问题?
不是高手,难以回答
》2,若需要上 线程锁?我该锁哪里? lock(de_All)?lock(ob)或其他位置?
大体看了下,似乎不锁也成
》3,死锁问题会存在?
按说不存在
明缘 2010-04-20
  • 打赏
  • 举报
回复
你的程序看不太懂,没有看到起新线程阿,一般来说加锁 是锁住一个空对象。
private Object objectLock = new object();
加锁的时机选择在 可能引起相互资源竞争 或者等待的场合。比如函数体内部。
lock (objectLock)
同时还要Lock 的方法为同一级别 避免死锁发生。
l171147904 2010-04-20
  • 打赏
  • 举报
回复
myhope88 2010-04-20
  • 打赏
  • 举报
回复
不懂,关注下
l171147904 2010-04-20
  • 打赏
  • 举报
回复
DADAUP
l171147904 2010-04-20
  • 打赏
  • 举报
回复
8 楼:
改为如下:

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
{
//执行操作
}
catch (Exception err)
{
throw err;
}
}
}

没明白你这 Object 意义!请解释下
l171147904 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 scoket 的回复:]
你的程序看不太懂,没有看到起新线程阿,一般来说加锁 是锁住一个空对象。
private Object objectLock = new object();
加锁的时机选择在 可能引起相互资源竞争 或者等待的场合。比如函数体内部。
lock (objectLock)
同时还要Lock 的方法为同一级别 避免死锁发生。
[/Quote]

没看懂,我想你 先了解下 线程池!
ThreadPool.QueueUserWorkItem(new WaitCallback(JanitorMethod), de); //线程池

l171147904 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 louti 的回复:]
关注 帮顶 说的200其实是100
[/Quote]

另外一贴还有100,解决的好!我再加100!
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
-----
楼上,他所有的对de_All 的操作都在try catch里面,他给的示例代买里面try是空的,所以我没有把lock操作写在里面,图个方便而已。

另外,就算写外面,只是说可能会有一些负面的问题,不影响对资源的保护。

你举个例子,什么时候这个lock也没用?
INGDI 2010-04-20
  • 打赏
  • 举报
回复
若线程池中对若干资源的访问需要同步,锁就要针对资源。8楼的锁提供了同步线程运行的功能,并没有保护具体的被多线程访问的资源。小弟认为锁应该针对资源的保护,即根据楼主的try中所做的事情进行设置,如果try中没有涉及被多个线程访问的资源,就没有必要进行同步了

111,129

社区成员

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

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

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