我有两个线程a,b。a线程将数据加入队列尾,b线程读取数据并删除队列头。线程a加入队列的速度快,b出队列的速度慢。问题是当b出队列结束后,发现结果中有近一半的数据是重复的。数据的大小为2048*500,共有500个数据。队列的定义为Queue<short[]> q = new Queue<short[]>();
------解决思路----------------------
多线程处理,必须要处理同步问题
lock是会影响读写效率,但是保证数据正确才是最基本的
lock的范围不要太大,仅在队列push和pop时就可以了
------解决思路----------------------
public static short[] data = new short[Convert.ToInt32(2048 * 500)];
//data 是引用对像,,
while(true)
{
//
Marshal.Copy(buf, data, 0, Convert.ToInt32(2048 * line));
lock (q)
{
//引用对像data 导致所有的queue里的data都是一个.
q.Enqueue(data);
}
}
data 是引用对像,改进方法
每次循环时创建一个新的data
while(true)
{
var data=short[200];//这个值楼主自己计算
Marshal.Copy(buf, data, 0, Convert.ToInt32(2048 * line));
lock (q)
{
//引用对像data 导致所有的queue里的data都是一个.
q.Enqueue(data);
}
}
------解决思路----------------------
数组是引用类型
如果没有其他地方引用了,那么就会释放了
比如你先把data放进队列里了,那么队列里保持对数组的引用,它就不会释放
而你一旦把它移出队列了,它就会被释放了
另外,释放的是资源,是数组的数据本身
不要谈data这个变量是否被释放了,它里面不过相当于一个指针