读书人

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

发布时间: 2012-02-22 19:36:56 作者: rapoo

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

读书人网 >软件开发

热点推荐