为实现多线程对一个全局结构数组的互斥访问,使用CRITICAL_SECTION,
由于数组项目比较多(100多个),看到有人的代码使用CRITICAL_SECTION数组,
然后访问时候使用
EnterCriticalSection(&CriGroup[nID%nCriCount]);
LeaveCriticalSection(&CriGroup[nID%nCriCount]);
对访问不同表项使用不同CRITICAL_SECTION.
我估计是为了减少等待进入的状况发生。但是有时候又要遍历整个表,他又使用另外的单个CRITICAL_SECTION(CriSingle)这样一来,就有可能进入CriSingle遍历整个表时候,其他线程进入CriGroup修改表项.
所以这里好象有问题.使用数组与使用单个CRITICAL_SECTION效率上有区别吗?

解决方案 »

  1.   

    我想他使用CRITICAL_SECTION数组的目的是想让不同的线程可以同时访问不同的数组项目,但是再另外定义一个CRITICAL_SECTION(CriSingle)用于遍历整个数组肯定是不对的,因为此时可能会有别的线程正在访问数组的某一个项目,所以应该在遍历过程中, 在访问每一个数组项目前,调用EnterCriticalSection(&CriGroup[nID%nCriCount]);
      

  2.   

    “使用CRITICAL_SECTION数组的目的是想让不同的线程可以同时访问不同的数组项目”
    我也认为他这么想,但这样做的效果与采用单个CRITICAL_SECTION对象相比,
    性能有很大的区别?好象没有理由,因为遍历也是经常的动作。
      

  3.   

    CRITICAL_SECTION因为是用户方式下工作所以并不消耗太多的cpu时间。所以我想,遍历时多用也无妨。另:可以用CRITICAL_SECTION(CriSingle)套住每个
    EnterCriticalSection(&CriGroup[nID%nCriCount]);
    LeaveCriticalSection(&CriGroup[nID%nCriCount]);
    遍历时用一个CRITICAL_SECTION(CriSingle)即可(应该不会死锁吧??....)