lean cpp library
A lean C++ library providing efficient utility classes for high-performance C++ applications.
|
00001 /*****************************************************/ 00002 /* lean Concurrent (c) Tobias Zirr 2011 */ 00003 /*****************************************************/ 00004 00005 #ifndef LEAN_CONCURRENT_CRITICAL_SECTION 00006 #define LEAN_CONCURRENT_CRITICAL_SECTION 00007 00008 #include "../lean.h" 00009 #include "../tags/noncopyable.h" 00010 #include <windows.h> 00011 00012 // Include automatically to encourage use of scoped_lock 00013 #include "../smart/scoped_lock.h" 00014 00015 namespace lean 00016 { 00017 namespace concurrent 00018 { 00019 00021 class critical_section : public noncopyable 00022 { 00023 private: 00024 CRITICAL_SECTION m_criticalSection; 00025 00026 public: 00028 critical_section(unsigned long spinCount = 4096) 00029 { 00030 if (!::InitializeCriticalSectionAndSpinCount(&m_criticalSection, spinCount)) 00031 LEAN_ASSERT(false); 00032 } 00034 ~critical_section() 00035 { 00036 ::DeleteCriticalSection(&m_criticalSection); 00037 } 00038 00040 LEAN_INLINE bool try_lock() 00041 { 00042 return (::TryEnterCriticalSection(&m_criticalSection) != FALSE); 00043 } 00044 00046 LEAN_INLINE void lock() 00047 { 00048 ::EnterCriticalSection(&m_criticalSection); 00049 } 00050 00052 LEAN_INLINE void unlock() 00053 { 00054 ::LeaveCriticalSection(&m_criticalSection); 00055 } 00056 }; 00057 00059 typedef smart::scoped_lock<critical_section> scoped_cs_lock; 00060 00061 } // namespace 00062 00063 using concurrent::critical_section; 00064 00065 using concurrent::scoped_cs_lock; 00066 00067 } // namespace 00068 00069 #endif