boost::serialization::singleton

boost的单件工具类 源码见文章底部。 class singleton 声明了一个静态引用     static T & m_instance; 这个静态引用是用来干嘛的呢?注意到该文件末尾有如下代码: template T & singleton::m_instance = singleton::get_instance();读到这里应该大概能理解了,该引用只是为了使用static的特性,该全局对象在程 阅读详情

Motivation:

   serialization library依赖一系列的静态变量和存储运行时类型的信息的表。例如存储名字和对应类型的表。存储基类和派生类的关系的表。构造,析构和静态变量的使用需要参考一下机制:

   *一些静态变量和常量指向别人。初始化的必须合理有序而不能是随意的。

   *一些静态变量并没有显示指定,并且没有特殊的预定义,将会被许多编译优化选项去掉

   * 这些变量大多都是用模板创建的必须确保他们被实例化

   *在多线程系统中,这些静态变量将会被不同的线程并发访问,这将会产生竞争的现象。其结果是无法预期的。

这个单例类解决了上诉的所有问题。

Feature:

  此单例的实现拥有一下特性。

  *所有的单例将会在被使用前构造完成。

  *所有用模板创建的实例确保被实例化。

  *无论一个实例是否被显示应用,在构造release模式的可执行文件时,这些实例不会被编译选项优化掉。

  *无论该实例在程序中的哪里被应用,所有的实例将在main之前被创建。在多线程机制的系统中这可以保证在创建实例时不会有竞争的现象并且不需要任何锁的机制去确保。

  *以上的机制表明所有的const实例在整个程序中是线程安全的,再次强调不需要线程锁机制。

  *如果创建一个muteable实例,并在多线程系统中调用main去修改该实例,则存在竞争的现象。serialization library只有在很少的地方用到muteable实例,并且也没有调用main修改该实例的值,线程锁机制是很容易被引用进来防止竞争的现象的,但是serialization library没有用到这种机制,所以就没有实现县城锁的机制。

Class Interface

namespace boost { 
namespace serialization {

template 
class singleton : public boost::noncopyable
{
public:
    static const T & get_const_instance();
    static T & get_mutable_instance();
    static bool is_destroyed();
};

} // namespace serialization 
} // namespace boost


static const T & get_const_instance();
返回一个该类的单例实例的一个常量引用。

static T & get_mutable_instance();
返回一个muteable的引用,指向该类型的单例

static bool is_destroyed();
如果该单例的析构函数被调用了则返回true,否则返回false


Requirements

使用singleton<T>,T必须有默认的构造函数,它并不需要包含静态变量(可能该类包含静态变量),因为该库保证只有一个singleton<T>的实例,并且所有访问通过以上的静态接口,T的公共成员函数等价于静态函数。


Examples

至少有两种不同的方式去使用这个模板类。都在serialization library中使用。

第一种方式通过文件extended_type_info.cpp的再录来说明。其中包含以下代码。

typedef std::set<const extended_type_info *, key_compare> ktmap;
...
void
extended_type_info::key_register(const char *key) {
    ...
    result = singleton<ktmap>::get_mutable_instance().insert(this);
    ...
}

通过在程序的任何地方指向该单例将会保证只有一个该类型的实例(在本例中类型为ktmap)在本程序中被创建。不需要其他的声明或定义。

第二种方式使用singleton<T>作为类型的基类之一。这通过extended_type_info_typeid.hpp的简化判断来说明。

template<class T>
class extended_type_info_typeid : 
    public detail::extended_type_info_typeid_0,
    public singleton<extended_type_info_typeid<const T> >
{
    friend class singleton<extended_type_info_typeid<const T> >;
private:
    // private constructor to inhibit any existence other than the 
    // static one.  Note: not all compilers support this !!!
    extended_type_info_typeid() :
        detail::extended_type_info_typeid_0()
    {
        type_register(typeid(T));
    }
    ~extended_type_info_typeid(){}
    ...
};
这种用法将允许使用一个更自然的语法格式。

extended_type_info_typeid<T>::get_const_instance()
再次强调在程序中包含一个或更多的以上的声明将会确保只会创建一个实例。

Multi-Threading

如果按照以下的规则使用该单例则这个单例模式是多线程安全的。

当在多线程环境下不要调用get_mutable_instance。存在一种单例的 lock/unlock函数去检测违反该规则的场景。

void boost::serialization::singleton_module::lock();
void boost::serialization::singleton_module::unlock();
bool boost::serialization::singleton_module::is_locked();

在编译debug模式下,任何包含调用get_mutable_instance(),如果当时该库正处于locked状态,将会陷入assertion。该单例模式在main函数之前被初始化为unlocked,允许修改静态变量。lock()与unlock()都是全局的,他们会影响该模板定义的所有单例。所有序列化测试在程序的开始处调用lock()。当程序在release模式下编译时这些锁函数将没有effect。



 






boost::serialization::singleton单例的使用方式 #include "stdafx.h" #include #include #include // 使用方式1:模板参数方式 class CTest:public boost::noncopyable // 不能复制、赋值 { public: void Set(int i){ m_val = i; } void Print() const{ std::cout<<m_val<<std: 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第一百三十四篇 编程语言篇 系列十三 PHP 01

本表格涵盖了PHP从内存管理(引用计数)、执行引擎(Zend VM/JIT)、核心数据结构(HashTable)、并发模型(Generator/Fiber)到工程实践(命名空间/类型系统)的关键底层机制。: PHP使用PCRE2库(Perl Compatible Regular Expressions),编译为正则表达式内部表示(字节码),通过pcre2_match()执行匹配。指向一个PHP脚本,该脚本在PHP-FPM启动时执行,将指定的类、函数等永久加载到OPcache共享内存中,且不会被清除。

weixin_49199313的博客 89

(七)boost库之单例类

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34380296的博客 340

机器学习预测材料性能:从特征工程到SHAP可解释性分析

机器学习在材料科学中的应用,核心在于将复杂的材料性能预测问题转化为数据驱动的建模任务。其基本原理是通过算法从历史数据中学习特征与目标属性之间的映射关系。这项技术的价值在于能够大幅加速新材料的发现与设计周期,降低传统“试错法”的高昂成本。在工程实践中,它广泛应用于预测如形成能、带隙、弹性模量以及居里温度等关键材料性能。具体到磁性材料领域,居里温度的准确预测对于永磁体和自旋电子器件设计至关重要。本项目深入探讨了如何利用特征工程从材料成分与结构中构建有效描述符,并借助SHAP这一可解释性工具,揭示模型决策背后的物

weixin_27155667的博客 650

boost之singleton.hpp

老版本中是文件对应在boost/pool/detail/singleton.hpp 使用时#include <boost/pool/detail/singleton.hpp> 然后boost::details::pool::singleton_default<Object>::instance 在新版中文件已经对应到boost/serializ...

weixin_33775582的博客 312

U盘安装单系统ubuntu10.04之全过程&拔掉U盘后系统无法启动

借助U盘把电脑装成ubuntu单系统之过程记录,以及遇到拔掉U盘后系统无法启动问题,电脑就显示: Non-System disk or disk error, replace and strike any key when ready

CXHPLY的专栏 8680

连接HP C7000 OA管理口操作文档

必备工具:1台便携式笔记本电脑、1根网线 2、 在C7000机箱背面找到 OA管理模块,如图:图标1和2为OA主备管理模块 将网线一端接至左边的OA管理网口,另一端接至便携式笔记本电脑网口,如图下位置: 在C7000液晶面板下查看OA管理口地址,如图,按下液晶面板的OK按钮 然后按下▼按钮调至Enclosure Info这一项后,按下OK按钮,输出界面如图:可以看到当前Active的OA管理口IP地址 比如显示地址为172.16.25.30,则个人笔记本电脑则配置172.16...

马晓援的博客 6012

boost中serialization模块的单体类

// singleton.cpp : 定义控制台应用程序的入口点。 //BOOST实现单体的两种方式 //1.通过boost的pool的singleton实现 //2.通过boost的serialization的singleton实现,采用继承或则定义一个单体类型 #include "stdafx.h" #include #include #define SGOB

davidsu33的专栏 1994

最大似然估计、梯度下降、EM算法、坐标上升

主要讲解的是机器学习中参数学习算法之间的区别,以及应用的场景。 最大似然估计: 其中目标函数是对数似然函数。为了求目标函数取最大值时的theta。有两个关机键步骤,第一个是对目标函数进行求导,第二个是另导数等于0,求解后直接得到最优theta。两个步骤缺一不可。 梯度下降: 对目标函数进行求导,利用导函数提供的梯度信息,使参数往梯度下降最快的方向移动一小步,来更新参数。为什

tzl2093的博客 5141

boost单例模式

本代码是仿照boost::singleton_default 1、zsingleton.h #ifndef ZSINGLETON_H #define ZSINGLETON_H template<typename T> struct ZSingleton { private: struct object_creator { object_creator() ...

大AI时代,人性化的信息更加难得可贵 223

电磁兼容标准体系解析:从基础到认证的完整指南

本文系统解析了电磁兼容(EMC)标准体系,从基础概念到认证流程提供完整指南。文章阐述了EMC对于产品可靠性与市场准入的重要性,详细拆解了基础标准、通用标准、产品类标准及认证流程四层结构,并结合5G设备与工业控制等实战案例,为工程师提供了从设计初期到认证测试的高效应用策略。

weixin_29294975的博客 355

PaddleOCR 3.x 最新版使用教程(2025)——从安装到实战身份证识别,一步到位!

本文针对PaddleOCR 3.x大版本更新带来的参数变化和兼容性问题,提供从环境配置到实际应用的全流程解决方案。

qq_58607032的博客 9788

Boost::Serialization试用手记

对于核心数据相对比较集中的应用程序来说,serialization机制可以直接充当文档保存与打开功能的实现工具,这也是很多成熟的应用程序framework都提供serialization支持的原因 但是个人认为,serialization最精彩的用处在于保存现场,比如在探索性的科研应用程序开发过程中,很可能一部分算法已经固定下来,其余的有待进一步探索,而确定下来的部分有可能十分time cons

searchwang的专栏 781

LAP-D协议概述

Q.921协议由称为LAPD(链路访问协议-D通道),与HDLC的关系密切,它是在ISDN D通道上使用的数据链路协议。 注:http://www.freesoft.org/CIE/Topics/125.htm LAP-D的帧格式 标志、位填充技术和FCS校验计算与HDLC一致。 16位的地址包括C/R字段、SAPI(服务访问点标识)和TEI(端点标识)。TEI用于区分使用相同ISDN...

系统运维 1914

boost库之单例类

转自:https://my.oschina.net/lingluonianhua/blog/213012 一、boost.serialzation的单件实现     单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个

zhangxueyang1的博客 1917

Open3D 可视化(1)——简单可视化【2026最新版】

简单可视化,博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 5686

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

boost的4种单例以及使用方法

boost4种单例及使用方法

山不在高有仙则灵,水不在深有龙则灵 817

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Boost 第四章 实用工具

本文章所有内容源于《BOOST程序库完全开发指南:深入C++“准”标准库(第3版)》第四章

weixin_42325783的博客 248

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式(一)单例模式Singleton

在面试的时候,面试官提到了单例模式。我没有接触过,但也了解。这让面试官对我的影响有所失望,回来之后就买了《设计模式-可复用面向对象软件的基础》。翻开单例模式,发现用C++实现的单例模式还真的有点水平。单例模式指在我们的程序中有一个组件,它的类只有唯一的一个对象,也不可以创建更多的对象。这种模式就是单例模式。 实现如下:上面的单例模式的实现要求我们如下方式使用类Singleton class

C++ 爱好者 make_it_simple888 1786

boost序列化单例3

https://blog.youkuaiyun.com/u012508160/article/details/79127729

qq_40178082的博客 160

无法访问 private 成员(在“boost::asio::detail::noncopyable”类中声明)

------解决方案-------------------- 所以,你的问题应该是没有使用引用,而是使用了拷贝。比如:C/C++ codeclass A { io_service io; public: A(io_service io_): io(io_) { } }; ------解决方案-------------------- io_service &io;这里

木棉花开时,凤凰涅槃日! 2314

QxOrm笔记(一)

QxOrm笔记(一)之前用过java,mybatis还真是个挺方便的东西,这次开发新系统,觉得需要在c++这边找个类似的东西。 正好用的就是Qt,于是,顺利成章的使用了这个QxOrm。QxOrm的编译编译环境是win10+mingw 5.1+Qt 5.5。 编译工具是QtCreator。 QxOrm的版本是1.3.2第一步 编译boost 因为QxOrm用到了boost,所以第一步是要编译b

糊涂一锅 6058
上一篇: 字符串中Emoji表情处理
下一篇: Linux中查找目录或文件中的内容总结
ppwangGS
博客等级 码龄11年 58粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值