例如我有2个线程,都会用到一个数据操作函数:
void Add(int nData);
假如我用临界值的话,应该用下面的那种才是正确的?
第一种:
UINT WorkThread(LPVOID lpVoid)
{
EnterCriticalSection(&cs);
Add(...);
LeaveCriticalSection(&cs);
return 0;
}
第二种:
UINT WorkThread(LPVOID lpVoid)
{
Add(...);
return 0;
}
void Add(int nData)
{
EnterCriticalSection(&cs);
nData++;
LeaveCriticalSection(&cs);
}
------解决方案--------------------------------------------------------
应该都没错,但是你要知道保护的是什么东西,你第一个整个线程都保护了,第二个就保护那个变量
------解决方案--------------------------------------------------------
都可以。如果涉及到数组元素的添加,删除,读取,写入,建议用第一种方法。
------解决方案--------------------------------------------------------
- C/C++ code
class CMyLock{public: CMyLock(){ ::InitializeCriticalSection(&m_cs); } ~CMyLock(){ ::DeleteCriticalSection(&m_cs); }LPCRITICAL_SECTION GetLock(){return &m_cs;}private: CRITICAL_SECTION m_cs;};class CMyAutoLock{public: CMyAutoLock(CMyLock& lock):m_lock(lock){ EnterCriticalSection(m_lock.GetLock()); } ~CMyAutoLock(){ LeaveCriticalSection(m_lock.GetLock()); }private: CMyLock& m_lock;};
------解决方案--------------------------------------------------------
事实上都没有什么问题,从效率上讲,当然是锁得越少越好.