📄 criticalsection.h
字号:
#ifndef UTILS_BASE_CRITICALSECTION_H_#define UTILS_BASE_CRITICALSECTION_H_#ifdef WIN32#include "win32.h"#endif#ifdef POSIX#include <pthread.h>#endif#ifdef _DEBUG#define CS_TRACK_OWNER 1#endif // _DEBUG#if CS_TRACK_OWNER#define TRACK_OWNER(x) x#else // !CS_TRACK_OWNER#define TRACK_OWNER(x)#endif // !CS_TRACK_OWNERnamespace utils_base {/// win32 platform#ifdef WIN32class CriticalSection {public: CriticalSection() { InitializeCriticalSection(&crit_); // Windows docs say 0 is not a valid thread id TRACK_OWNER(thread_ = 0); } ~CriticalSection() { DeleteCriticalSection(&crit_); } void Enter() { EnterCriticalSection(&crit_); TRACK_OWNER(thread_ = GetCurrentThreadId()); } void Leave() { TRACK_OWNER(thread_ = 0); LeaveCriticalSection(&crit_); }#if CS_TRACK_OWNER bool CurrentThreadIsOwner() const { return thread_ == GetCurrentThreadId(); }#endif // CS_TRACK_OWNERprivate: CRITICAL_SECTION crit_; TRACK_OWNER(DWORD thread_); // The section's owning thread id};#endif // WIN32/// posix platform#ifdef POSIXclass CriticalSection {public: CriticalSection() { pthread_mutexattr_t mutex_attribute; pthread_mutexattr_settype(&mutex_attribute, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&mutex_, &mutex_attribute); } ~CriticalSection() { pthread_mutex_destroy(&mutex_); } void Enter() { pthread_mutex_lock(&mutex_); } void Leave() { pthread_mutex_unlock(&mutex_); }private: pthread_mutex_t mutex_;};#endif // POSIX/// CritScope, for serializing exection through a scopeclass CritScope {public: CritScope(CriticalSection *pcrit) { pcrit_ = pcrit; pcrit_->Enter(); } ~CritScope() { pcrit_->Leave(); }private: CriticalSection *pcrit_;};} // namespace utils_base#endif // UTILS_BASE_CRITICALSECTION_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -