本文共 3697 字,大约阅读时间需要 12 分钟。
\n\n\n\n\n \n \n \nRAII(Resource Acquisition Is Initialization,是C++语言的一种资源管理方法,旨在避免资源泄漏。C++的对象特性保证了任何构造的对象最终都会被销毁,析构函数最终将被调用。RAII的核心思想是使用对象在构造时获取资源,在对象的生命周期内控制资源的访问权限,并在对象的析构时释放资源。这种方式确保了资源的所有权和控制权,使得开发者无需手动管理资源的生命周期。
\n \n以下是基于RAII对各种锁进行封装的实现代码示例:
\n\n#ifndef __LOCK_H\n#define __LOCK_H\n#include \n#include \n#include \n#include \n#include \n\nstruct Noncopyable {\n Noncopyable() = default;\n ~Noncopyable() = default;\n Noncopyable(const Noncopyable&) = delete;\n Noncopyable& operator=(const Noncopyable&) = delete;\n};\n\nclass Semaphore : Noncopyable {\npublic:\n explicit Semaphore(uint32_t count = 0) {\n sem_init(&m_sem, 0, count);\n }\n ~Semaphore() {\n sem_destroy(&m_sem);\n }\n void wait() {\n sem_wait(&m_sem);\n }\n void notify() {\n sem_post(&m_sem);\n }\nprivate:\n sem_t m_sem;\n};\n\ntemplate \nclass ScopedLock {\npublic:\n ScopedLock(T& m) : m_mutex(m) {\n lock();\n }\n ~ScopedLock() {\n unlock();\n }\n void lock() {\n if (!m_lock) {\n m_mutex.lock();\n m_lock = true;\n }\n }\n void unlock() {\n if (m_lock) {\n m_mutex.unlock();\n m_lock = false;\n }\n }\nprivate:\n T& m_mutex;\n bool m_lock = false;\n};\n\ntemplate \nclass WriteScopedLock {\npublic:\n WriteScopedLock(T& m) : m_mutex(m) {\n lock();\n }\n ~WriteScopedLock() {\n unlock();\n }\n void lock() {\n if (!m_lock) {\n m_mutex.wrlock();\n m_lock = true;\n }\n }\n void unlock() {\n if (m_lock) {\n m_mutex.unlock();\n m_lock = false;\n }\n }\nprivate:\n T& m_mutex;\n bool m_lock = false;\n};\n\ntemplate \nclass ReadScopedLock {\npublic:\n ReadScopedLock(T& m) : m_mutex(m) {\n lock();\n }\n ~ReadScopedLock() {\n unlock();\n }\n void lock() {\n if (!m_lock) {\n m_mutex.rdlock();\n m_lock = true;\n }\n }\n void unlock() {\n if (m_lock) {\n m_mutex.unlock();\n m_lock = false;\n }\n }\nprivate:\n T& m_mutex;\n bool m_lock = false;\n};\n\nclass Mutex : Noncopyable {\npublic:\n typedef ScopedLock Lock;\n Mutex() {\n pthread_mutex_init(&m_mutex, nullptr);\n }\n ~Mutex() {\n pthread_mutex_destroy(&m_mutex);\n }\n void lock() {\n pthread_mutex_lock(&m_mutex);\n }\n int trylock() {\n pthread_mutex_trylock(&m_mutex);\n }\n void unlock() {\n pthread_mutex_unlock(&m_mutex);\n }\nprivate:\n pthread_mutex_t m_mutex;\n};\n\nclass RWMutex : Noncopyable {\npublic:\n typedef WriteScopedLock WriteLock;\n typedef ReadScopedLock ReadLock;\n RWMutex() {\n pthread_rwlock_init(&m_lock, nullptr);\n }\n ~RWMutex() {\n pthread_rwlock_destroy(&m_lock);\n }\n void rdlock() {\n pthread_rwlock_rdlock(&m_lock);\n }\n void wrlock() {\n pthread_rwlock_wrlock(&m_lock);\n }\n void unlock() {\n pthread_rwlock_unlock(&m_lock);\n }\nprivate:\n pthread_rwlock_t m_lock;\n};\n\nclass SpinLock : Noncopyable {\npublic:\n typedef ScopedLock Lock;\n SpinLock() {\n pthread_spin_init(&m_mutex, 0);\n }\n ~SpinLock() {\n pthread_spin_destroy(&m_mutex);\n }\n void lock() {\n pthread_spin_lock(&m_mutex);\n }\n int trylock() {\n pthread_spin_trylock(&m_mutex);\n }\n void unlock() {\n pthread_spin_unlock(&m_mutex);\n }\nprivate:\n pthread_spinlock_t m_mutex;\n};\n\nclass CASLock : Noncopyable {\npublic:\n typedef ScopedLock Lock;\n CASLock() {\n m_mutex.clear();\n }\n ~CASLock() {\n }\n void lock() {\n while (std::atomic_flag_test_and_set_explicit(&m_mutex, std::memory_order_acquire));\n }\n void unlock() {\n std::atomic_flag_clear_explicit(&m_mutex, std::memory_order_release);\n }\nprivate:\n volatile std::atomic_flag m_mutex;\n}\n\n#endif /**__LOCK_H*/
\n\n\n 转载地址:http://gtsgz.baihongyu.com/