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

解决方案 »

  1.   

    你的程序看不太懂,没有看到起新线程阿,一般来说加锁 是锁住一个空对象。
     private Object objectLock = new object();
    加锁的时机选择在 可能引起相互资源竞争 或者等待的场合。比如函数体内部。
    lock (objectLock)
    同时还要Lock 的方法为同一级别 避免死锁发生。
      

  2.   

    》1,我这代码是否存在安全问题?
    不是高手,难以回答
    》2,若需要上 线程锁?我该锁哪里? lock(de_All)?lock(ob)或其他位置?
    大体看了下,似乎不锁也成
    》3,死锁问题会存在?
    按说不存在
      

  3.   

    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,死锁问题会存在?
      

  4.   

    若线程池中对若干资源的访问需要同步,锁就要针对资源。8楼的锁提供了同步线程运行的功能,并没有保护具体的被多线程访问的资源。小弟认为锁应该针对资源的保护,即根据楼主的try中所做的事情进行设置,如果try中没有涉及被多个线程访问的资源,就没有必要进行同步了
      

  5.   

    -----
    楼上,他所有的对de_All 的操作都在try catch里面,他给的示例代买里面try是空的,所以我没有把lock操作写在里面,图个方便而已。另外,就算写外面,只是说可能会有一些负面的问题,不影响对资源的保护。你举个例子,什么时候这个lock也没用?
      

  6.   


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

  7.   

    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 意义!请解释下