3个线程,一个线程遍历LIST读,一个线程LIST写,一个线程对LIST节点删除。由于第一个读的线程需要很高的实时性,所以设置的为3毫秒执行一次。问题就在这里了,在遍历前我LOCK了LIST,而读线程的执行频率很高,这样就导致,CPU在大多数的时间都是被读线程占用的了,导致对LIST写的线程半天都写不进去数据。(写线程的操作也很频繁)大家看看有什么好的处理方式没有,因为还有个线程是对节点进行删除的,如果读线程不LOCK的话,可能会导致数据问题。请不要简单的 lock 这个词就回答了哈。3Q。

解决方案 »

  1.   

    能不能让读的线程去读一个Clone出来的List,而只有当删除节点的线程工作时去更新这个Clone出来的List给读线程,这时候要lock下。我说的是浅表clone.
      

  2.   

    list这个很难写成lock-free的线程安全,queue和stack之类的可以比较容易写成lock-free的
    不知道lz读和写的具体情况,所以很难说能不能写成lock-free的
      

  3.   

    要不别lock了,但读/删的时候要额外判断诸如在下标越界之类的吧。确实感觉好诡异
      

  4.   

    写,删在一块
    读在一块如果以读为主的话 需要建立两个变量 记录读线程的操作位置和工作顺序
    写删线程只允许对该操作位置以后(前)的数据进行操作(取决于工作顺序)读的时候不能 foreach 要用while() 因为写删操作会影响队列长度
    并且为了提高效率 读线程一定要轮流使用正序和反序两种循环交替工作的方式,以给写删线程操作的机会 我想这样应该能到达lz的要求吧
      

  5.   

    3毫秒 如果你的list里边数据大点啥都不管用了
      

  6.   

    是啊,如果写操作相对较少,可以考虑每次写操作都要重建读副本,这样读的时候就不要lock了.
      

  7.   

    复制是肯定成事不足的,因为每当数据修改,复制的代价巨大,那么总的来说可能就更加混和更慢。要想修改算法,就要首先修改结构。最慢地,你可以使用 Dictionary<K,T> 或者 SortedList<K, T> 来保存数据,或者更进一步使用 SortedDictionary<K, T>。
      

  8.   

    定义一个公共变量 public static object Lockobj;操作 list<T> WorkList
    读线程
    list<T> TempList;
    try
    {
    System.Threading.Monitor.Enter(Lockobj);TempList=new List<T>(WorkList);
    }finally
    {
    System.Threading.Monitor.Exit(Lockobj);
    }
    后面操作TempList增加线程try
    {
    System.Threading.Monitor.Enter(Lockobj);你的增加处理
    }finally
    {
    System.Threading.Monitor.Exit(Lockobj);
    }删除线程try
    {
    System.Threading.Monitor.Enter(Lockobj);你的删除处理
    }finally
    {
    System.Threading.Monitor.Exit(Lockobj);
    }
      

  9.   

    其实我自己也有这种感觉。要想安全。肯定在READER的时候(因为有多个WRITE)会加锁。由于实现方式的原因导致加锁会造成部分WRITE线程阻塞。
    从根本来说优化遍历或者说改变实现方式才是最好的解决方式。
      

  10.   

    用事件Event处理吧.
    表在写和删除操作时产生一个更新Event
    在Event处理函数中进行读操作