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 + -
显示快捷键?