CMutex是很好的选择!当你的共享的数据是要多个线程可以互斥的访问多次(大于1次)时,用CSemaphore很适合;
当次数为一次时, 用CMutex很适合;
 在同一个进程的共享数据CSemaphore,CMutex 的功能都可以用CCriticalSection 来实现
你可以到www.developer.com上找到代码的.

解决方案 »

  1.   

    用临界区仅仅用到5个函数,而且都是单参数的,我想应该是最简单的方法了,给个例子:
    //创建临界区
    CRITICAL_SECTION g_CriticalSection;  //创建为全局变量,也可以为所有线程都可以访问到的局部变量
    InItializaCriticalSection(&g_CrilicalSection); // 初始化。
    //当某个线程要访问CString strText时,先调用: 
    EnterCriticalSection(&g_CrilicalSection);
      //访问CString strText,进行修改如strText.Find("aaa")
    LeaveCrilicalSection(&g_CrilicalSection);  //确认访问完毕,离开临界区
    //当程序执行完毕,释放临界区对象。
    DeleteCriticalSection(&g_CriticalSection);
    如果在某个线程调用了EnterCriticalSection()进入了某个临界区后,其它线程也调用EnterCriticalSection()欲进入同一临界区,则后进的线程被挂起等待直至第一个线程离开临界区,这样就保证了同时只有一个线程位于临界区内,所以对CString strText的修改是安全的。
      

  2.   

    笔误了InItializaCriticalSection应该是InitializeCriticalSection,sorry!
      

  3.   

    如果你是在一个进程中保护全局变量,最好是CCriticalSection了,速度快,CMutex可以让多个进程共享资源,我想一般用不着吧,用vc的话很简单,自己做一个类就行了,把要保护的变量作为类的一个私有成员变量,所有的访问都通过函数进行,像这样:
    class CMyData  
    {
    public:
    CMyData();
    virtual ~CMyData();
             void GetString(CString* pString);
    private:
    CCriticalSection m_Locker;
             CString strText;
    };
    void CMyData::GetString(CString* pString)
    {
        m_Locker.Lock();
        *pString=strText;
        m_Locker.Unlock();
    }
    总之当访问公共变量时先lock(),用完unlock()就行了,当lock()时,其他要访问的线程会挂起,直到unlock()为止。忘了,要include "afxmt.h"