本文共 4263 字,大约阅读时间需要 14 分钟。
这个文件很简单, 来看下:
/** * Tencent is pleased to support the open source community by making Tars available. * * Copyright (C) 2016THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * https://opensource.org/licenses/BSD-3-Clause * * Unless required by applicable law or agreed to in writing, software distributed * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */#ifndef _TC_LOCK_H#define _TC_LOCK_H#include#include #include #include "util/tc_ex.h"using namespace std;namespace tars{//** * @file tc_lock.h * @brief 锁类 */ //*** @brief 锁异常*/struct TC_Lock_Exception : public TC_Exception{ TC_Lock_Exception(const string &buffer) : TC_Exception(buffer){}; TC_Lock_Exception(const string &buffer, int err) : TC_Exception(buffer, err){}; ~TC_Lock_Exception() throw() {};};/** * @brief 锁模板类其他具体锁配合使用, * 构造时候加锁,析够的时候解锁 */template class TC_LockT{public: /** * @brief 构造函数,构造时枷锁 * * @param mutex 锁对象 */ TC_LockT(const T& mutex) : _mutex(mutex) { _mutex.lock(); _acquired = true; } /** * @brief 析构,析构时解锁 */ virtual ~TC_LockT() { if (_acquired) { _mutex.unlock(); } } /** * @brief 上锁, 如果已经上锁,则抛出异常 */ void acquire() const { if (_acquired) { throw TC_Lock_Exception("thread has locked!"); } _mutex.lock(); _acquired = true; } /** * @brief 尝试上锁. * * @return 成功返回true,否则返回false */ bool tryAcquire() const { _acquired = _mutex.tryLock(); return _acquired; } /** * @brief 释放锁, 如果没有上过锁, 则抛出异常 */ void release() const { if (!_acquired) { throw TC_Lock_Exception("thread hasn't been locked!"); } _mutex.unlock(); _acquired = false; } /** * @brief 是否已经上锁. * * @return 返回true已经上锁,否则返回false */ bool acquired() const { return _acquired; }protected: /** * @brief 构造函数 * 用于锁尝试操作,与TC_LockT相似 * */ TC_LockT(const T& mutex, bool) : _mutex(mutex) { _acquired = _mutex.tryLock(); }private: // Not implemented; prevents accidental use. TC_LockT(const TC_LockT&); TC_LockT& operator=(const TC_LockT&);protected: /** * 锁对象 */ const T& _mutex; /** * 是否已经上锁 */ mutable bool _acquired;};/** * @brief 尝试上锁 */template class TC_TryLockT : public TC_LockT {public: TC_TryLockT(const T& mutex) : TC_LockT (mutex, true) { }};/** * @brief 空锁, 不做任何锁动作 */class TC_EmptyMutex{public: /** * @brief 写锁. * * @return int, 0 正确 */ int lock() const {return 0;} /** * @brief 解写锁 */ int unlock() const {return 0;} /** * @brief 尝试解锁. * * @return int, 0 正确 */ bool trylock() const {return true;}};/** * @brief 读写锁读锁模板类 * 构造时候加锁,析够的时候解锁 */template class TC_RW_RLockT{public: /** * @brief 构造函数,构造时枷锁 * * @param lock 锁对象 */ TC_RW_RLockT(T& lock) : _rwLock(lock),_acquired(false) { _rwLock.ReadLock(); _acquired = true; } /** * @brief 析构时解锁 */ ~TC_RW_RLockT() { if (_acquired) { _rwLock.Unlock(); } }private: /** *锁对象 */ const T& _rwLock; /** * 是否已经上锁 */ mutable bool _acquired; TC_RW_RLockT(const TC_RW_RLockT&); TC_RW_RLockT& operator=(const TC_RW_RLockT&);};template class TC_RW_WLockT{public: /** * @brief 构造函数,构造时枷锁 * * @param lock 锁对象 */ TC_RW_WLockT(T& lock) : _rwLock(lock),_acquired(false) { _rwLock.WriteLock(); _acquired = true; } /** * @brief 析构时解锁 */ ~TC_RW_WLockT() { if(_acquired) { _rwLock.Unlock(); } }private: /** *锁对象 */ const T& _rwLock; /** * 是否已经上锁 */ mutable bool _acquired; TC_RW_WLockT(const TC_RW_WLockT&); TC_RW_WLockT& operator=(const TC_RW_WLockT&);};};#endif
针对锁和基本操作,定义了类模板, 仅此而已。
这种代码, 我是很欣赏的:
private: // Not implemented; prevents accidental use. TC_LockT(const TC_LockT&); TC_LockT& operator=(const TC_LockT&);
不多说。
转载地址:http://hgwti.baihongyu.com/