The standard way of realizing mutual exclusion between threads under Windows NT is using critical sections. The four basic system calls for critical sections are
You can implement a simple wrapper class for critical sections in the following manner:
class CCriticalSection {
private:
#ifdef _MT
CRITICAL_SECTION m_critical_section;
#endif
public:
CCriticalSection (void) {
#ifdef _MT
::InitializeCriticalSection (&m_critical_section);
#endif
}
~CCriticalSection (void) {
#ifdef _MT
::DeleteCriticalSection (&m_critical_section);
#endif
}
void Enter (void) {
#ifdef _MT
::EnterCriticalSection (&m_critical_section);
#endif
}
void Leave (void) {
#ifdef _MT
::LeaveCriticalSection (&m_critical_section);
#endif
}
};
If you want to use critical sections exception safe, you should try something like the following guard helper class:
class CCriticalSectionGuard {
private:
CCriticalSection &m_critical_section;
public:
CCriticalSectionGuard (CCriticalSection &critical_section):
m_critical_section (critical_section) {
m_critical_section.Enter ();
}
~CCriticalSectionGuard (void) {
m_critical_section.Leave ();
}
};
© 2000-2002 GeNeSys
mbH & Co. KG
Last revised: 12/14/2000