当前位置:编程学习 > C#/ASP.NET >>

关于多线程共享资源的问题

一个线程用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啊。 --------------------编程问答--------------------
引用 2 楼 kkkkkxiaofei 的回复:
如果是三个模块都需要这个接到的数据,那么完全可以将接到的数据存到一个类里,类里可设置一个字段保存byte[],在设置一个属性去监测你所谓的队满,然后三个模块都去读取值就行了。如果你三个模块要对该数据进行三种不同的操作,那完全可以new三个对象出来,这样各操作各的。这里和多线程资源共享没有没有半毛钱关系。因为你已经在线程里给二级缓冲区赋值了(上面的类),窗体只是在读取那个.CS啊。


你问题都没看清楚 我的缓冲区设置得很完善不需要你教 关键是缓冲区去读接受的byte【】怎么保持一致, 快了就会重复读到好几个相同的,慢了就会丢数据 请看清楚问题 --------------------编程问答--------------------
引用 1 楼 zhuawang 的回复:
用AutoResetEvent吧



我想过用这个信号量解决,但是写出的程序有点问题,会有点混乱,能不能给个具体一点的方案 --------------------编程问答--------------------
引用 3 楼 o7Eleven 的回复:
Quote: 引用 2 楼 kkkkkxiaofei 的回复:

如果是三个模块都需要这个接到的数据,那么完全可以将接到的数据存到一个类里,类里可设置一个字段保存byte[],在设置一个属性去监测你所谓的队满,然后三个模块都去读取值就行了。如果你三个模块要对该数据进行三种不同的操作,那完全可以new三个对象出来,这样各操作各的。这里和多线程资源共享没有没有半毛钱关系。因为你已经在线程里给二级缓冲区赋值了(上面的类),窗体只是在读取那个.CS啊。


你问题都没看清楚 我的缓冲区设置得很完善不需要你教 关键是缓冲区去读接受的byte【】怎么保持一致, 快了就会重复读到好几个相同的,慢了就会丢数据 请看清楚问题

1.读数据的时候加lock,这个最简单。
2.EventWaitHandle(类似上面哥们说的那个)来同步,读线程读的时候要让其他Wait,读完之后Set,这样就同步了,操作详见MSDN,例子很多。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,