有一批线程,可能在需要的时候重新刷新缓存,
而有一批线程,在读这快缓存,如果给缓存访问都加上锁,单线进,似乎有些不好,我们想让读的线程只要没有线程进入写缓存流程,就都放行,让他们并行读都可以,如果有线程已经在写缓存时,就等待,如果已经有线程在写或者读缓存时,其他需要写缓存的线程要等待读和写都完成才进去.不知道改怎么加锁比较合理,谢谢各位老大

解决方案 »

  1.   

    多谢 cnzdgs,分缓冲为小区在这个软件里似乎不好整(情况有点特殊),如果能有其他办法就好了。。
      

  2.   


    BYTE vbBuffer[1024];
    int nHead = 0, nTail = 0;使用环形缓冲区,nHead指向数据起始位置,nTail指向数据结束位置
    一个线程写入时增加nTail,另外一个线程读取时增加nHead
    缓冲区保存数据大小为(nTail - nHead + 1024) % 1024如果nHead == nTail表示为空,如果(nHead + 1) % 1024 == nTail表示缓冲区满用上面方式实现,就可以不用加锁
    这个方法只适用于一个线程读,一个线程写的特殊情况
      

  3.   

    多谢 vocanicy , 有多个线程序写
      

  4.   

    多谢各位,终于想到办法了,分享一下,有不对之处,请指正int nReadLockCount = 0 , nWriteLockCount = 0;读缓冲过程之前
           while nWriteLockCount >0 do Sleep(4);
          EnterCriticalSection(xx);
          inc(nReadLockCount);
          LeaveCriticalSection(xx);
          xxxx//读缓冲操作
          EnterCriticalSection(xx);
          Dec(nReadLockCount);
          LeaveCriticalSection(xx);
          写缓冲过程之前
           while nWriteLockCount>0 or nReadLockCount>0 do Sleep(4);
          EnterCriticalSection(xx);
          inc(nWriteLockCount);
          xxxx//读缓冲操作
           Dec(nWriteLockCount);
          LeaveCriticalSection(xx);写不来C代码,只好这么贴了,希望能明白意思,汗水