首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

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

2012-02-22 
byte[] 多线程同步/// summary/// 所有的SocketAsyncEventArgs使用的大缓冲区/// /summaryprivate rea

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……

热点排行