读书人

关于多线程同步的有关问题精通多线程

发布时间: 2012-01-18 00:23:26 作者: rapoo

关于多线程同步的问题,精通多线程机制的请进
做的一个网络同步采集数据的程序,思路是缓冲区数据超过260个字节后开始处理。由于NetworkStream不支持获取缓冲区字节数,所以我想自己写个类,通过一个自定义缓冲区来达到支持的目的。代码如下:

C# code
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace CaijiTest
{
class NetReceiveBuffer
{
TcpClient tc;
int BufferLength;
byte[] NetBuffer;
NetworkStream netStream;
Thread thread;
ThreadStart ts;
int iPosition=0;
byte bt;
public NetReceiveBuffer(string ip,int port,int length)
{
BufferLength = length;
NetBuffer = new byte[length];
tc = new TcpClient(ip, port);
netStream = tc.GetStream();
ts = new ThreadStart(Receive);
thread = new Thread(ts);
thread.Start();
}

public int BytesToRead
{
get
{
return iPosition;
}
}

private void Receive()
{
while (true)
{
Thread.Sleep(1);
NetBuffer[iPosition] = (byte)netStream.ReadByte();
iPosition++;
if (iPosition == NetBuffer.Length)
{
Buffer.BlockCopy(NetBuffer, 1, NetBuffer, 0, NetBuffer.Length - 1);//丢弃第一个字节,后续数据向前移动一个字节
iPosition--;//回到缓冲区最后一个字节的位置
}
}
}

public void Read(byte[] buffer, int offset, int size)
{
lock (this)
{
Buffer.BlockCopy(NetBuffer, 0, buffer, offset, size);
Buffer.BlockCopy(NetBuffer, size, NetBuffer, 0, iPosition - size);
iPosition -= size;
}
}

public byte ReadByte()
{
lock (this)
{
bt = NetBuffer[0];
Buffer.BlockCopy(NetBuffer, 1, NetBuffer, 0, iPosition - 1);//丢弃第一个字节,后续数据向前移动一个字节


iPosition--;
return bt;
}
}


~NetReceiveBuffer()
{
thread.Abort();
}
}
}



问题是客户程序在操作Read()或ReadByte()方法的时候,thread线程还在继续读取数据,请问如何保证使用Read()或ReadByte()方法执行过程中缓冲区数据不会发生改变。

[解决办法]
在Receive里也lock(this),即会造成互斥。
[解决办法]
lock( NetBuffer)这个试试
[解决办法]
用lock正解

[解决办法]
生产者和消费者的问题,用lock或者Monitor都可以
[解决办法]
Socket.Available 就是你要的缓冲区字节数。
[解决办法]
参考C# WinForm开发系列 - Thread/Delegate/Event
[解决办法]
探讨
生产者和消费者的问题,用lock或者Monitor都可以

[解决办法]
lock(object) 正解
[解决办法]
互拆访问, 锁定资源, 用Monitor复杂一点, Lock方便, 效率嘛, 要看生产消费的比率了
[解决办法]
做一个全局的静态object
在Read(),ReadByte()和你的Receive中都lock这个静态的ojbect就可以做到互斥
[解决办法]
lock方便一些
[解决办法]
读写竞争问题可以先用lock做代码验证,但最好用ReaderWriterLock以达到性能最大化,.netfx3.5的话用ReaderWriterLockSlim更简单方便。

读书人网 >C#

热点推荐