Base——Singleton类

这篇博客详细介绍了C++中Singleton类的实现,包括使用pthread_once保证线程安全的instance()函数,以及利用atexit()注册析构函数,确保单例在程序退出时正确销毁。同时,文章给出了测试用例Singleton_test.cc的运行结果,展示了多线程环境下单例对象的正确访问和共享。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.一个公有函数instance(),其余为私有

在这里插入图片描述

  • pthread_once():
int pthread_once(pthread_once_t *once_control,
           		 void (*init_routine)(void));
           		 
保证init_routine指向的函数只执行一次
  • init()函数定义如下:

在这里插入图片描述

  • atexit():
int atexit(void (*function)(void));

the given function to be called at normal process termination
  • destroy()函数定义如下:
    在这里插入图片描述

typedef定义了一个char数组,数组的大小根据 T 类型是否是完整类型来定。
若不是完整类型,则数组大小为-1,在编译阶段报错。
不完整类型举例:
在这里插入图片描述

2.测试用例 Singleton_test.cc

  • 运行结果:
    在这里插入图片描述
    各个线程都可以访问到这个单例对象,当一个对象对其进行修改后,其它线程也能得知。
    参考代码
### C# 中的对象概念 在 C# 编程语言中,**(Class)** 是一种用户定义的数据型,它封装了数据和操作这些数据的方法。而 **对象(Object)** 则是的一个具体实例[^1]。 #### 定义 是一种抽象的概念,用于描述一组具有相同属性和行为的事物。以下是定义一个简单的示例: ```csharp public class Car { // 字段:存储状态 public string Color; public int Speed; // 方法:表示行为 public void Accelerate() { Speed += 10; } } ``` 在这个例子中,`Car` 有两个字段 `Color` 和 `Speed` 表示汽车的颜色和速度,还有一个方法 `Accelerate()` 来增加汽车的速度[^2]。 #### 创建对象 要使用的功能,需要创建该的具体实例——即对象。这可以通过 `new` 关键字实现。例如: ```csharp // 使用 new 运算符创建 Car 的实例 Car myCar = new Car(); // 设置对象的状态 myCar.Color = "Red"; myCar.Speed = 0; // 调用对象的行为 myCar.Accelerate(); Console.WriteLine($"The car's speed is now {myCar.Speed}."); ``` 上述代码片段展示了如何通过 `new` 运算符实例化一个 `Car` 对象,并设置其颜色和调用加速方法。 #### 继承与多态 C# 支持继承机制,子可以从父继承属性和方法并对其进行扩展或覆盖。这种特性增强了程序的可重用性和灵活性[^5]。例如: ```csharp public class ElectricCar : Car { public double BatteryLevel; public void ChargeBattery(double amount) { BatteryLevel += amount; } // 覆盖父方法 public override void Accelerate() { base.Accelerate(); Console.WriteLine("Electric motor engaged!"); } } // 实例化 ElectricCar 并测试功能 ElectricCar tesla = new ElectricCar(); tesla.ChargeBattery(50); tesla.Accelerate(); ``` 在此示例中,`ElectricCar` 继承自 `Car`,增加了电池充电功能,并修改了加速逻辑。 #### 单例模式 有时希望某个在整个应用程序生命周期中只有一个全局共享的实例,这时可以采用单例设计模式[^4]。下面是一个通用的单例基实现: ```csharp using System; public class Singleton<T> where T : new() { private static T _instance; public static T Instance { get { if (_instance == null) _instance = new T(); return _instance; } } } // 测试单例模式 class Program { static void Main(string[] args) { var instance1 = Singleton<Logger>.Instance; var instance2 = Singleton<Logger>.Instance; Console.WriteLine(instance1 == instance2); // 输出 True } } public class Logger { /* ... */ } ``` 此代码确保无论何时请求 `Singleton<Logger>` 的实例,始终返回相同的对象引用。 --- ### 总结 C# 中的是对现实世界实体的一种建模方式,而对象则是基于此模型构建的实际个体。通过组合、继承以及高级的设计模式(如单例),开发者能够高效地管理复杂系统的结构和交互[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值