当前位置: 代码迷 >> C# >> C#关于多线程操作队列的有关问题
  详细解决方案

C#关于多线程操作队列的有关问题

热度:30   发布时间:2016-05-05 04:37:32.0
C#关于多线程操作队列的问题
我有两个线程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);
                       }
}

------解决思路----------------------
引用:
是我弄错了,不过我还想知道
while(i<500)
{
      short[] data = new short[Convert.ToInt32(2048 * 500)];
      q.Enqueue(data);
       i++;
}
这样做的话每次被分配的data都会被释放吗

数组是引用类型
如果没有其他地方引用了,那么就会释放了
比如你先把data放进队列里了,那么队列里保持对数组的引用,它就不会释放
而你一旦把它移出队列了,它就会被释放了

另外,释放的是资源,是数组的数据本身
不要谈data这个变量是否被释放了,它里面不过相当于一个指针
  相关解决方案