升级log4cxx遭遇synchronized缺失问题求助
解决log4cxx从v0.10.0升级到v1.1.0后
synchronized类缺失的问题 方案1:替换为C++标准库的RAII锁
原来的synchronized sync(mutex);是典型的RAII风格锁实现,C++11及以后的标准库已经提供了等价的std::lock_guard,直接替换即可:
- 引入标准库头文件
<mutex> - 将原有代码中的:
替换为:synchronized sync(mutex);
如果你使用的是log4cxx自带的std::lock_guard<std::mutex> lock(mutex);log4cxx::helpers::Mutex,同样可以适配,因为它提供了标准的lock()和unlock()方法,替换为:std::lock_guard<log4cxx::helpers::Mutex> lock(mutex);
方案2:手动实现兼容的synchronized类
如果不想大规模修改代码,可以自己实现一个和旧版log4cxx行为一致的synchronized类,直接复用原有写法:
#include <mutex> // 适配原有synchronized的模板实现 template<typename Mutex> class synchronized { public: // 构造时锁定互斥量 explicit synchronized(Mutex& mtx) : mutex(mtx) { mutex.lock(); } // 析构时自动解锁 ~synchronized() { mutex.unlock(); } // 禁止拷贝和赋值 synchronized(const synchronized&) = delete; synchronized& operator=(const synchronized&) = delete; private: Mutex& mutex; };
将这段代码放到公共头文件中,原有代码的synchronized sync(mutex);写法无需修改即可正常编译。
方案3:使用log4cxx v1.1.0的内置同步工具
log4cxx v1.x版本已经转向依赖C++标准库的线程工具,若需要使用库内置的同步封装,可以查看其log4cxx/thread/目录下的工具类,比如部分版本提供的log4cxx::thread::Guard,用法和旧版synchronized一致:
log4cxx::thread::Guard guard(mutex);
内容的提问来源于stack exchange,提问作者Akhil kumar k
相关产品推荐
相关产品推荐

