如何让几个线程同时访问一个主线程里的集合中的对象,设计出比较 高效率的方法,尽量让所有线程不闲置,
但是又要保证数据同步性。怎么搞?

解决方案 »

  1.   

    多线程访集合item,对集合中的Item进行lock,如果访问到的Item已经被lock则可以等待或者略过访问下一项,lock和判断是否被lock可以使用
    if(Monitor.TryEnter(item))//如果获得了锁
    {
    //do somethingMonitor.Exit(item);
    }
    else
    {
    //处理下一个item
    }
      

  2.   

    如果要对List<T>进行的item的添加删除,则需要lock(list)
      

  3.   


    晕!我是绝对不会这样看待线程的。很明显,你所谓的线程就是一个轮询、死循环。这根本就是“咄咄怪事”!
    比如说我们的服务器系统,假设有1000个客户端长连接,其中有20个客户端瞬间“并发”发来了50条命令,服务器系统接收它的那一瞬间应该使用大致20个线程,然后接受完了之后也就不占用任何线程了。你认为是用一个线程去“死循环轮询”?还是“用1001个线程去“死循环轮询”?这50条命令,假设其中有10条命令来自于同一个客户端长连接,那么服务器是异步连续接收到这10条命令,可能今需要使用一个线程,并且根本不用等待每条命令的返回。因为服务器自然需要异步多线程去计算每一条命令,总不能排着队顺序执行这些命令吧!那么每一条命令异步计算出结果,于是就用计算线程直接发回结果给客户端就行了。因此从客户端来看,它异步地执行了10次socket.asyncSend命令,而收到的返回结果的次序跟发送命令次序可能根本是不同的。这才是多线程编程。这里边,一眼就可以看出,什么“用一个线程处理收发”,实在是阻塞的方式、顺序的思路来模拟异步并发程序设计,根本上是不对路的。使用线程,不是空洞地“设计”什么“一线程收、一个线程发”这类无意义的概念。使用现线程很简单,就是一旦底层驱动中断抛出了一个数据接收事件,我们的异步回调方法就会在线程池中的一个线程中去处理这个数据接收,以及之后的处理。假设同时有20个中断,瞬间之中可能就会有线程池中20个线程被用来处理数据接收。每一个线程都是瞬间被用于处理,然后很快(例如10几毫秒左右)处理完接收的数据,发送后续处理结果,线程立刻就被释放会系统线程池里边去了。这样整体性能就快了。你的线程概念,我看来就好象对者鹦鹉放海豚音一样,完全不是我所知道的线程设计应有的概念。
      

  4.   

    如果你跟踪线程池中利用情况,假设就是简单地一个服务程序在监听和处理消息,假设有上千个客户端保持连接,你可能看到瞬间使用了20个线程、然后使用了30个线程,然后10几秒钟之后只使用了5个线程.....总之线程分配是瞬间的,线程知识用来做几毫秒的工作(而不是做什么“死循环、轮询”工作),系统使用多少线程数是不确定的。但总的来说,平均使用少量线程,就能以非常高的并发率来处理大量异步请求,处理过程中不会感觉到阻塞。例如一个基于地图的复杂GIS系统上同时对服务器发起50个请求,这50个请求的返回次序自然跟发命令的次序没有关系(因为是异步并行地嘛),虽然平均每一个请求的响应时间达到了20毫秒,可是50个请求确可以保证在200毫秒内(而不是1000毫秒开外)全都执行完毕。
      

  5.   


    Sp1234 大哥,我知道您的意思,
    其实事情是这样子的,
    这些对象需要保持连接,并且每秒钟都数据传输,所以Socket 通讯只是一个手段,
    问题是 当我在不断地 操作这些对象的某些属性发送到客户端的同时接收客户端的操作,也就是近乎实时地与他们交互数据。停止交互的时候就是客户端退出系统断开连接的时候。在保持通信的同时,服务器端不断地检查这些对象之间的关系是否发生了某些事件
    然后在每次客户端发来操作时 将操作更新到将相应的对象上去这是一个“实时”的,系统目前主要遇到的问题就是这个。主要是想通过多线程来增加吞吐量
    目前暂时使用的是单进程但是单线程的缺点是,顺序执行,一条10米宽的马路车开得再快也解决不了根本问题啊
    所以,看起来,又不能再造一条【数据不互通】,只有加大马路的宽度【线程,但是数据可以实时同步】
      

  6.   

    lz。你那集合的元素数量是不是不会变化?如果是不会变化,那你这里多线程访问的重点是集合中的对象。也就是说同一时刻,集合中的某个特定对象会被多线程访问,并不是你的集合本身会被多线程访问。所以你应该重构你集合中保存的那个对象类型。让对这个类型的属性的读取是线程安全的。所以你对集合的操作加不加lock无所谓。关键是集合中的对象的属性在set或get的时候要加lock。