关于多线程同步问题.

threadroc 2013-07-20 08:20:57
lock(Queue)
{
//code here;
}
我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象.
可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据.
求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了.
...全文
256 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
请叫我卷福 2013-07-21
  • 打赏
  • 举报
回复
检查 //code here中的代码 建议专门定义“锁对象” 不要使用Queue本身 lock(Queue) { //code here; } //code here 搞不好它又使用了lock(Queue) object syncRoot = new object(); //锁 lock(syncRoot) { // operate with queue } 一个Queue对应一个锁对象
  • 打赏
  • 举报
回复
贴出你的死锁程序来,说明哪一条语句死锁了?! 如果贴不出来,那么不值得纠结在这里。
heiyedebing 2013-07-21
  • 打赏
  • 举报
回复
只要你lock同一个对象就不会死锁,除非你lock了多个对象,在lock内部又lock了别的对象就会死锁
本拉灯 2013-07-20
  • 打赏
  • 举报
回复
引用 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 也不会死锁了。[/quote] 那个,我不太明白呀,比如说1000个线程调用这个方法,执行到这段代码的时候,不是还有可能造成死锁吗?望指教...[/quote] 就算你用10000个调上面的代码也不会死锁 用只要不是 lock里面又有lock 基本不会死锁
threadroc 2013-07-20
  • 打赏
  • 举报
回复
引用 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 也不会死锁了。[/quote] 那个,我不太明白呀,比如说1000个线程调用这个方法,执行到这段代码的时候,不是还有可能造成死锁吗?望指教...
本拉灯 2013-07-20
  • 打赏
  • 举报
回复
引用 楼主 threadroc 的回复:
lock(Queue) { //code here; } 我用lock锁住一个队列,让1000个线程,访问这个队列的时候,能1个1个取,使其不至于2个线程取到同一个对象. 可是问题就来了,仅仅这么锁住还不行,会造成死锁.于是部分线程就返回不回来,然后就会丢失一部分数据. 求大神指教,怎么让这段代码,既让多线程访问,既可以同步,又不早成死锁呢?小弟,在这里先谢过了.
队列lock就要在取出时lock其他的不要再lock写个方法 public xxx Dequeue() { lock(Queue) { return Queue.Dequeue(); } } 下面你线程怎么调就怎么调不用再lock 也不会死锁了。
全栈极简 2013-07-20
  • 打赏
  • 举报
回复
参考:http://www.csharpwin.com/csharpspace/9332r3428.shtml 里面提到:在某种情况下t1和t2对锁的使用产生了冲突,形成了死锁,也就出现了如上图所示的情况,为了避免这种情况可以通过让t2延时一个合适的时间。

110,533

社区成员

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

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

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