巧妙包装解决boost::mutex不能复制问题
在C++中编写一个类,如果我们没明确的创建 拷贝函数和 opertae=的重载,IDE一般会在编译的时候主动添加;
在Boost库中,对mutex类没有实现其拷贝和operate=函数,查看其mutex.hpp文件可见如下:
class mutex:
public ::boost::detail::underlying_mutex
{
private:
mutex(mutex const&);
mutex& operator=(mutex const&);
public:
mutex()
{
initialize();
}
~mutex()
{
destroy();
}
typedef unique_lock<mutex> scoped_lock;
typedef detail::try_lock_wrapper<mutex> scoped_try_lock;
};
{
private:
mutex(mutex const&);
mutex& operator=(mutex const&);
public:
mutex()
{
initialize();
}
~mutex()
{
destroy();
}
typedef unique_lock<mutex> scoped_lock;
typedef detail::try_lock_wrapper<mutex> scoped_try_lock;
};
这样的问题导致我们在使用mutex时只能全局的去定义它,或者使用指针指向一个全局的mutex对象;
下面的定义都是错误的:
struct A{
boost::mutex m;
};
class B{
public: boost::mutex m;}
boost::mutex m;
};
class B{
public: boost::mutex m;}
尤其当我们使用标准容器,如verctor、map 的时候,执行添加或者赋值操作的时候实际都是通过对象的拷贝来完成的,上面的错误写法将直接无法编译!
由于mutex对象没有拷贝实现,那我们可能会这样去定义它:
class A{
public:
boost::mutex *m;
A(){
m=new boost::mutex();
}
~A(){
delete m;
}}
public:
boost::mutex *m;
A(){
m=new boost::mutex();
}
~A(){
delete m;
}}
按照上面的写法看似没有什么问题,我们通过简单的包装,在类构造时创建mutex对象并将指向指向它,在析构函数释放。
但这样实际还是比摆脱不了,A类创建的对象只能作为全局变量来使用命运,
当其拷贝的时候 拷贝的是内部成员变量m ,拷贝完成原对象释放后,新拷贝出的对象在执行析构函数时就会产生错误,因为m指向的内存已经被释放过了!
这种问题其实是我们在C++开发中,如果类中包含指针类型,且对象有可能产生拷贝时需要特别注意的一个问题;
这个时候我们需要明确的实现类拷贝函数和operate=重载函数,实现方式如下:
class video_mutex{
public:
boost::mutex* value;
video_mutex(){
value=new boost::mutex();
}
~video_mutex(){
delete value;
}
video_mutex(video_mutex const& mutex)
{
value=new boost::mutex();
}
video_mutex& operator=(video_mutex const& mutext){
return *this;
}};
public:
boost::mutex* value;
video_mutex(){
value=new boost::mutex();
}
~video_mutex(){
delete value;
}
video_mutex(video_mutex const& mutex)
{
value=new boost::mutex();
}
video_mutex& operator=(video_mutex const& mutext){
return *this;
}};
当然这种方法所产生的代价就是频繁new出新的mutex对象 并且释放它 ;
通过上面的实现,我们就可以放心的进行video_mutex的拷贝,将他push到vector中或者赋值给map['key'] 都不会在有任何问题了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2011-10-25 通过Socket进行HttP/HTTPS网页操作