Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限
来源:互联网 发布:阿里云服务器出现宕机 编辑:程序博客网 时间:2024/05/26 12:08
我在编写多线程的时候使用了System.Collections.Generic.Queue<T>类。
在Queue的Enqueue方法执行时,经常会偶然性的出现(不是每次一开始运行就出现问题,而是达到一定时间后才出现,我称之为经常会偶然性的出现)
“源数组长度不足。请检查 srcIndex 和长度以及数组的下限”这种类型的提示语。
我在百度知道上面进行了提问,得到了芝麻的热心帮助:
2014-05-17 23:18sunruisunrui | 分类:C#/.NET | 浏览13次
Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。使用的时候包含了多线程,不知道和这有没有关系。
举报| 2014-05-17 23:30提问者采纳
与多线程并发操作Queue有关!
1)如果你用的是System.Collection.Queue集合,插入队列时
1
2
3
4
5
6
System.Collection.Queue q =
new
System.Collection.Queue();
//锁定队列集合,然后插入
lock
(q.SyncRoot)
{
q.Enqueue(……);
}
2)如果你用的是System.Collections.Generic.Queue<T>
1
2
3
4
5
6
object
synObj =
new
object
();
System.Collections.Generic.Queue<
int
> q = System.Collections.Generic.Queue<
int
>();
lock
(syncObj)
{
q.Enqueue(……);
}
追问
今天 00:15
不知道这里第二段代码中为何需要对于这个object进行lock而不是对q进行lock?
回答
今天 01:11
lock(obj){…}后面两个大括号直接的代码称为临界区。当一个线程执行位于代码的临界区时,另一个线程会阻止在临界区外,不会进入该临界区,一直到该lock(obj)锁定的象obj被释放。第二代码片段中,当然可以这样写lock(q){ }用q(队列)作为lock的锁定对象。但这样做有个缺点:一旦q被lock锁定,其他对q进行只读操作的线程也无法存取这个q了。使用了最简单对象object synObj = new object()做为lock锁定对象,这样,在多线程环境中:允许一个线程对队列进行修改;同时允许其他线程读取队列。
- 提问者评价
谢谢!
这里,他提到了lock,这个我也知道,但是这个锁的使用方法,和这个临界区的概念才是重头戏。
【接下来我会测试这个方法是否管用,并且完善博文】
0 0
- Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限
- Queue插入的时候报错的处理方法:源数组长度不足。请检查 srcIndex 和长度以及数组的下限
- C#源数组长度不足。请检查 srcIndex 和长度以及数组的下限
- 未定义长度和定义长度的数组
- 数组和指针的长度
- 数组的大小和长度
- 没有长度的数组
- 字符数组的长度
- 求数组的长度?
- 字符数组的长度
- 零长度的数组
- 获取数组的长度
- 求数组的长度
- 计算数组的长度
- 数组长度的增减
- 求数组的长度
- 数组长度的获取
- 数组的长度
- 1.WebService基于SoapHeader实现安全认证
- BP算法怎样使用梯度下降方法调整权值
- Tomcat 学习进阶历程之Tomcat启动过程分析
- 1. 序言
- 微策略校招笔试题
- Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限
- Recursive Depth first search graph(adj matrix)
- c/c++中内存区域划分大总结
- (转)二分查找法的实现和应用汇总
- sdfsdfsdfsd
- uva 10499
- Xcode 下配置svn(转)
- C++ ofstream和ifstream详细用法以及C语言的file用法
- EXEC和sp_executesql的区别