偷懒copy了一个网上现成的自动锁,嵌入项目后调试中屡屡出问题,原类如下:
class CLock
{
public:
CLock()
{
InitializeCriticalSection(&m_cs);
}
~CLock()
{
DeleteCriticalSection(&m_cs);
}
void Lock()
{
EnterCriticalSection(&m_cs);
}
void Unlock()
{
LeaveCriticalSection(&m_cs);
}
private:
CRITICAL_SECTION m_cs;
};
class AutoLock
{
public:
AutoLock()
{
m_lock.Lock();
}
~AutoLock()
{
m_lock.Unlock();
}
private:
CLock m_lock;
private:
AutoLock(const AutoLock& lock);
AutoLock& operator=(const AutoLock& lock);
};
调用时使用
AutoLock auto_lock;
测试代码:
#define THREAD_NUM 64 //最大只能64线程
int g_nResource;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
{
AutoLock auto_lock;
printf("Thread id %d Resource Count %d\n",
GetCurrentThreadId(),
g_nResource);
g_nResource++;
}
Sleep(1);
return 0;
}
int main(int argc, char *argv[])
{
HANDLE hThreads[THREAD_NUM] = {0};
for(int i = 0; i < THREAD_NUM; i++)
hThreads[i] = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
WaitForMultipleObjects(THREAD_NUM, hThreads, TRUE, INFINITE);
getchar();
return 0;
}

分析发现是 AutoLock auto_lock; 每次创建的CLock是私有变量,没法解决共享问题。
因此要解决,其一,将CLock调整为全局变量,但带来安全问题。其二,定义为局部静态变量。
class CLock
{
public:
CLock()
{
InitializeCriticalSection(&m_cs);
}
~CLock()
{
DeleteCriticalSection(&m_cs);
}
void Lock()
{
EnterCriticalSection(&m_cs);
}
void Unlock()
{
LeaveCriticalSection(&m_cs);
}
private:
CRITICAL_SECTION m_cs;
};
class AutoLock
{
public:
AutoLock()
{
m_lock.Lock();
}
~AutoLock()
{
m_lock.Unlock();
}
private:
static CLock m_lock;//声明,全局中初始化
private:
AutoLock(const AutoLock& lock);
AutoLock& operator=(const AutoLock& lock);
};
CLock AutoLock::m_lock;//初始化
再次测试,OK!