当前位置:编程学习 > C#/ASP.NET >>

关于多线程同步问题.

lock(Queue)
{
  //code here;
}
我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象.
可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据.
求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了. --------------------编程问答-------------------- 参考:http://www.csharpwin.com/csharpspace/9332r3428.shtml
里面提到:在某种情况下t1和t2对锁的使用产生了冲突,形成了死锁,也就出现了如上图所示的情况,为了避免这种情况可以通过让t2延时一个合适的时间。 --------------------编程问答--------------------
引用 楼主 threadroc 的回复:
lock(Queue)
{
  //code here;
}
我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象.
可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据.
求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了.


队列lock就要在取出时lock其他的不要再lock写个方法

public xxx Dequeue()
{
   lock(Queue)
   {
      return Queue.Dequeue();
   }
}

下面你线程怎么调就怎么调不用再lock 也不会死锁了。 --------------------编程问答--------------------
引用 2 楼 wyd1520 的回复:
Quote: 引用 楼主 threadroc 的回复:

lock(Queue)
{
  //code here;
}
我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象.
可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据.
求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了.


队列lock就要在取出时lock其他的不要再lock写个方法

public xxx Dequeue()
{
   lock(Queue)
   {
      return Queue.Dequeue();
   }
}

下面你线程怎么调就怎么调不用再lock 也不会死锁了。


那个,我不太明白呀,比如说1000个线程调用这个方法,执行到这段代码的时候,不是还有可能造成死锁吗?望指教... --------------------编程问答--------------------
引用 3 楼 threadroc 的回复:
Quote: 引用 2 楼 wyd1520 的回复:

Quote: 引用 楼主 threadroc 的回复:

lock(Queue)
{
  //code here;
}
我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象.
可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据.
求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了.


队列lock就要在取出时lock其他的不要再lock写个方法

public xxx Dequeue()
{
   lock(Queue)
   {
      return Queue.Dequeue();
   }
}

下面你线程怎么调就怎么调不用再lock 也不会死锁了。


那个,我不太明白呀,比如说1000个线程调用这个方法,执行到这段代码的时候,不是还有可能造成死锁吗?望指教...


就算你用10000个调上面的代码也不会死锁

用只要不是 lock里面又有lock 基本不会死锁
--------------------编程问答-------------------- 检查 //code here中的代码  建议专门定义“锁对象”  不要使用Queue本身 

lock(Queue)
{
  //code here;
}
//code here 搞不好它又使用了lock(Queue)

object syncRoot = new object(); //锁
lock(syncRoot)
{
     // operate with queue
}

一个Queue对应一个锁对象 --------------------编程问答-------------------- 只要你lock同一个对象就不会死锁,除非你lock了多个对象,在lock内部又lock了别的对象就会死锁 --------------------编程问答-------------------- 贴出你的死锁程序来,说明哪一条语句死锁了?!

如果贴不出来,那么不值得纠结在这里。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,