当前位置: 代码迷 >> 多核软件开发 >> byte[] 多线程同步,该怎么处理
  详细解决方案

byte[] 多线程同步,该怎么处理

热度:7221   发布时间:2013-02-26 00:00:00.0
byte[] 多线程同步
/// <summary>
 /// 所有的SocketAsyncEventArgs使用的大缓冲区
 /// </summary>
 private readonly byte[] _buffer; 

/// <summary>
 /// 将ArraySegment拷贝到args的缓冲区
 /// </summary>
 /// <param name="srcArr">要拷贝的ArraySegment</param>
 /// <param name="args">SocketAsyncEventArgs</param>
 public void BufferCopy(ArraySegment<byte> srcArr, SocketAsyncEventArgs args)
 {
  if (srcArr.Count < 100)
  Array.Clear(_buffer, args.Offset, 100);
  Buffer.BlockCopy(srcArr.Array, srcArr.Offset, _buffer, args.Offset, srcArr.Count);
 }
=============================================================================================
上面的函数,是 通讯的时候 给 SocketAsyncEventArgs缓冲区拷贝数据的。 其中_buffer被若干个 SocketAsyncEventArgs使用的大缓冲区。很显然,每个SocketAsyncEventArgs使用 _buffer的不同区段。 

这个函数之前我是 加锁的,使用的 ReaderWriterLockSlim.EnterWriteLock(); 之后经过推敲,我觉得集合大小没有修改,仅仅是 往里面拷贝数据。没有必要进行锁定。不知我的想法是否正确,疑惑中。

原先的代码:
_rwLock.EnterWriteLock();
if (srcArr.Count < 100)
  Array.Clear(_buffer, args.Offset, 100);
Buffer.BlockCopy(srcArr.Array, srcArr.Offset, _buffer, args.Offset, srcArr.Count);

_rwLock.ExistWriteLock();

------解决方案--------------------------------------------------------
看来SocketAsyncEventArgs这个类开始被越来越多的人使用了,你用的是内存池吧?既然是每个SocketAsyncEventArgs类对应着一段自己独享的内存缓冲区的话,那何必要去加锁操作呢?
------解决方案--------------------------------------------------------
探讨
若干个 SocketAsyncEventArgs

------解决方案--------------------------------------------------------
探讨
引用:
引用:
若干个 SocketAsyncEventArgs

“若干个”这是什么意思呢?

既然你知道可以分开什么Offset,那么你何不把它设置为byte[][]或者List<byte[]>,这样也省得搞什么Offset。


我开发的是服务端,有多个 SocketAsyncEventArgs接收客户端的连接。这些S……
  相关解决方案