关于多线程共享资源的问题
一个线程用while(true)循环接收远程主机的数据public void Recv()
{
udpClient = new UdpClient(port);
udpClient.Client.ReceiveBufferSize = 1024 * 1024 * 1024;
try
{
while (true)
{
byte[] bytes = udpClient.Receive(ref remote);
}
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
}
,把该数据bytes放入三个缓冲区(队列)以供不同的功能模块取用(所以三个缓冲区的取用速度等都是不一样的,三个缓冲区是相互独立的)...该怎么实现这个功能呢
注意 这个缓冲区是预先定义好的 如果缓冲区满了就阻塞禁止加入队列。如果如下:会出现一种情况 就是如果队列一满了阻塞了会影响后面的队列二 三 ;怎么让这三个队列互不影响
public void Recv()
{
udpClient = new UdpClient(port);
udpClient.Client.ReceiveBufferSize = 1024 * 1024 * 1024;
try
{
while (true)
{
byte[] bytes = udpClient.Receive(ref remote);
队列一入队;
队列二入队;
队列三入队;
}
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
}
--------------------编程问答-------------------- 用AutoResetEvent吧 --------------------编程问答-------------------- 如果是三个模块都需要这个接到的数据,那么完全可以将接到的数据存到一个类里,类里可设置一个字段保存byte[],在设置一个属性去监测你所谓的队满,然后三个模块都去读取值就行了。如果你三个模块要对该数据进行三种不同的操作,那完全可以new三个对象出来,这样各操作各的。这里和多线程资源共享没有没有半毛钱关系。因为你已经在线程里给二级缓冲区赋值了(上面的类),窗体只是在读取那个.CS啊。 --------------------编程问答--------------------
你问题都没看清楚 我的缓冲区设置得很完善不需要你教 关键是缓冲区去读接受的byte【】怎么保持一致, 快了就会重复读到好几个相同的,慢了就会丢数据 请看清楚问题 --------------------编程问答--------------------
我想过用这个信号量解决,但是写出的程序有点问题,会有点混乱,能不能给个具体一点的方案 --------------------编程问答--------------------
1.读数据的时候加lock,这个最简单。
2.EventWaitHandle(类似上面哥们说的那个)来同步,读线程读的时候要让其他Wait,读完之后Set,这样就同步了,操作详见MSDN,例子很多。
补充:.NET技术 , C#