当前位置: 代码迷 >> 多核软件开发 >> 线程同步应该在函数内还是外?解决办法
  详细解决方案

线程同步应该在函数内还是外?解决办法

热度:4076   发布时间:2013-02-26 00:00:00.0
线程同步应该在函数内还是外?
例如我有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;};
------解决方案--------------------------------------------------------
事实上都没有什么问题,从效率上讲,当然是锁得越少越好.
  相关解决方案