简单说,当一个线程执行了EnterCritialSection之后,cs里面的信息便被修改了,以指明哪一个线程占用了它。而此时,并没有任何资源被“锁定”。不管什么资源,其它线程都还是可以访问的(当然,执行的结果可能是错误的)。只不过,在这个线程尚未执行LeaveCriticalSection之前,其它线程碰到EnterCritialSection语句的话,就会处于等待状态,相当于线程被挂起了。 这种情况下,就起到了保护共享资源的作用。
也正由于CRITICAL_SECTION是这样发挥作用的,所以,必须把每一个线程中访问共享资源的语句都放在EnterCritialSection和LeaveCriticalSection之间。这是初学者很容易忽略的地方。
#include <windows.h> class CTLock { public: CTLock(); ~CTLock(); CRITICAL_SECTION m_cs; // 临界区 inline void Lock() { EnterCriticalSection(&m_cs); } inline void Unlock() { LeaveCriticalSection(&m_cs); } }; CTLock::CTLock() { InitializeCriticalSection(&m_cs); } CTLock::~CTLock() { DeleteCriticalSection(&m_cs); }