criticalsection.h

来自「本人收集整理的一份c/c++跨平台网络库」· C头文件 代码 · 共 95 行

H
95
字号
#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 + =
减小字号Ctrl + -
显示快捷键?