做门户网站 cms,江苏省建设银行网站,简约大方自助建站模板,手机网站建设 新闻最近写了一个hiredis的连接池#xff0c;借鉴了HiRedis库封装#xff0c;加了些日志#xff0c;发现这个在ReleaseClient函数中构造shared_ptr时#xff0c;没有指定delete。修改后在项目使用过程中发现执行一段时间后总是是卡死#xff0c;使用的是boost库中的锁及其条件…最近写了一个hiredis的连接池借鉴了HiRedis库封装加了些日志发现这个在ReleaseClient函数中构造shared_ptr时没有指定delete。修改后在项目使用过程中发现执行一段时间后总是是卡死使用的是boost库中的锁及其条件变量。 而日志系统中也用到了锁添加日志调用时无序的。 连接池中用的锁用lock1表示日志系统中用的锁用lock2表示 就会出现线程1调用锁的顺序为lock1-lock2而线程2调用锁的顺序为lock2-lock1造成死锁 将日志调用去掉后没有出现卡死情况了
typedef std::shared_ptrRedisClient RedisClientPtr;class HiRedisPool
{
public:static HiRedisPool* getInstance(){static HiRedisPool instance;return instance;}void init(const std::string ip, int port, size_t maxCon);void getRedisClient(RedisClientPtr redisClientPtr);void releaseClient(RedisClient *client_ptr);inline size_t size(){boost::lock_guardboost::mutex lock(_mutex);return _pool.size();}inline size_t used(){boost::lock_guardboost::mutex lock(_mutex);return _used;}private:HiRedisPool();HiRedisPool(const HiRedisPool other);HiRedisPool operator(const HiRedisPool other);private:std::string _ip;int _port;size_t _used;size_t _maxConnection;std::listRedisClientPtr _pool;boost::mutex _mutex;boost::condition_variable _cv;
};HiRedisPool::HiRedisPool()
{}void HiRedisPool::init(const std::string ip, int port, size_t maxCon)
{boost::lock_guardboost::mutex lock(_mutex);_ip ip;_port port;_maxConnection maxCon;_used 0;
}void HiRedisPool::getRedisClient(RedisClientPtr redisClientPtr)
{boost::unique_lockboost::mutex lock(_mutex);if (!_pool.empty()) {redisClientPtr _pool.front();_pool.pop_front();} else if (_used _maxConnection){_used;redisClientPtr std::shared_ptrRedisClient(new RedisClient(_ip, _port),std::bind(HiRedisPool::releaseClient, this, std::placeholders::_1));} else {_cv.wait(lock, [this](){return !this-_pool.empty();});redisClientPtr _pool.front();_pool.pop_front();}
}void HiRedisPool::releaseClient(RedisClient *client_ptr)
{{boost::lock_guardboost::mutex lock(_mutex);_pool.push_back(std::shared_ptrRedisClient(client_ptr,std::bind(HiRedisPool::releaseClient, this, std::placeholders::_1)));}_cv.notify_one();}