CMutex是很好的选择!当你的共享的数据是要多个线程可以互斥的访问多次(大于1次)时,用CSemaphore很适合;
当次数为一次时, 用CMutex很适合;
在同一个进程的共享数据CSemaphore,CMutex 的功能都可以用CCriticalSection 来实现
你可以到www.developer.com上找到代码的.
当次数为一次时, 用CMutex很适合;
在同一个进程的共享数据CSemaphore,CMutex 的功能都可以用CCriticalSection 来实现
你可以到www.developer.com上找到代码的.
//创建临界区
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的修改是安全的。
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"