关于多线程同步问题.
lock(Queue){
//code here;
}
我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象.
可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据.
求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了. --------------------编程问答-------------------- 参考:http://www.csharpwin.com/csharpspace/9332r3428.shtml
里面提到:在某种情况下t1和t2对锁的使用产生了冲突,形成了死锁,也就出现了如上图所示的情况,为了避免这种情况可以通过让t2延时一个合适的时间。 --------------------编程问答--------------------
队列lock就要在取出时lock其他的不要再lock写个方法
public xxx Dequeue()
{
lock(Queue)
{
return Queue.Dequeue();
}
}
下面你线程怎么调就怎么调不用再lock 也不会死锁了。 --------------------编程问答--------------------
那个,我不太明白呀,比如说1000个线程调用这个方法,执行到这段代码的时候,不是还有可能造成死锁吗?望指教... --------------------编程问答--------------------
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#