一个用作管理元素的类:
GetList()函数得到实例内所有元素的名字。
Add()函数新建一个元素。
Remove()函数删除一个元素。
现在它的一个实例能被多个线程访问。我希望这个实例的GetList()函数可被不同线程同时调用,但此时要阻塞Add()函数和Remove()函数的调用,如何做到?难点是:允许所有线程同时调用pABC->GetList()。
若是在类中设一个Mutex,三个函数在运行时取得它得所有权,则必定会令所有线程不能同时调用pABC->GetList(),违背我意愿。如何协调这个矛盾?

解决方案 »

  1.   

    设一个static的标志位不知道也许可以。
    static int i=0;GetList()
    {
        i++;
        ....
        i--;
    }
    在Add()和Remove时判断i是否为0;如果是才可以继续做。
      

  2.   

    刚才想了一个办法:在Add()与remove()两个函数的第一句用
    WaitForSingleObject(m_hMutex,INFINITE);
    而GetList()的第一句用
    WaitForSingleObject(m_hMutex,50);这样可部分地实现我的要求,仅仅是有个潜在性的安全问题:当GetList()没得到mutex的所有权并在运行中,此时刚好其它线程又调用了remove(),此时会不会引起读取无效指针错误呢?
      

  3.   

    WaitForSingleObject(m_hMutex,INFINITE);//add you code ReleaseMutex(m_hMutex);
      

  4.   

    在这里标准作法应该是:
    重载那个LIST,
    加一个关键区(CriticalSection),
    并重载Add()和Remove()函数。
    在进入关键区后才可以调用基类的这两个函数。GetList()就不用管了。
    因为这时多个线程可以同时使用这个LIST了。
      

  5.   

    CriticalSection吗?惭愧,第一次听说,我去试试,今晚回来结贴。谢谢rtdb(东临碣石) 高手!!!!!!!!!!!