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
{
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
private Object objectLock = new object();
加锁的时机选择在 可能引起相互资源竞争 或者等待的场合。比如函数体内部。
lock (objectLock)
同时还要Lock 的方法为同一级别 避免死锁发生。
不是高手,难以回答
》2,若需要上 线程锁?我该锁哪里? lock(de_All)?lock(ob)或其他位置?
大体看了下,似乎不锁也成
》3,死锁问题会存在?
按说不存在
------------------------
存在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,死锁问题会存在?
楼上,他所有的对de_All 的操作都在try catch里面,他给的示例代买里面try是空的,所以我没有把lock操作写在里面,图个方便而已。另外,就算写外面,只是说可能会有一些负面的问题,不影响对资源的保护。你举个例子,什么时候这个lock也没用?
没看懂,我想你 先了解下 线程池!
ThreadPool.QueueUserWorkItem(new WaitCallback(JanitorMethod), de); //线程池
改为如下: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 意义!请解释下