利用C++单例模式实现高性能配置管理器

代码中,使用了单例模式来创建配置管理器对象,保证了整个程序中只有一个配置管理器对象。配置管理器中包含了配置项数组、配置项数量、互斥锁等成员,通过这些成员来实现配置文件的读取和配置项的获取。在主函数中,获取了一个配置项的值,并打印出来,最后销毁互斥锁、释放内存。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>

#define MAX_CONFIG_SIZE 1024

// 配置项结构体
typedef struct {
    char* key; // 配置项键
    char* value; // 配置项值
} ConfigItem;

// 配置管理器结构体
typedef struct {
    ConfigItem* items; // 配置项数组
    int count; // 配置项数量
    pthread_mutex_t lock; // 互斥锁
} ConfigManager;

// 配置管理器单例结构体
typedef struct {
    ConfigManager* manager; // 配置管理器指针
} ConfigManagerSingleton;

static ConfigManagerSingleton* instance = NULL; // 配置管理器单例对象指针

// 读取配置文件函数
void read_config_file(const char* filename) {
    ConfigManager* manager = instance->manager;
    FILE* file = fopen(filename, "r");
    if (file == NULL) {
        return;
    }
    char line[MAX_CONFIG_SIZE];
    while (fgets(line, sizeof(line), file) != NULL) {
        char* key = strtok(line, "=");
        char* value = strtok(NULL, "\n");
        if (key != NULL && value != NULL) {
            ConfigItem item;
            item.key = strdup(key);
            item.value = strdup(value);
            pthread_mutex_lock(&manager->lock);
            manager->items[manager->count++] = item;
            pthread_mutex_unlock(&manager->lock);
        }
    }
    fclose(file);
}

// 获取配置项值函数
const char* get_config_value(const char* key) {
    ConfigManager* manager = instance->manager;
    for (int i = 0; i < manager->count; i++) {
        if (strcmp(manager->items[i].key, key) == 0) {
            return manager->items[i].value;
        }
    }
    return NULL;
}

// 获取配置管理器单例对象函数
ConfigManager* get_config_manager_instance() {
    if (instance == NULL) {
        instance = (ConfigManagerSingleton*)malloc(sizeof(ConfigManagerSingleton));
        instance->manager = (ConfigManager*)malloc(sizeof(ConfigManager));
        instance->manager->items = (ConfigItem*)malloc(sizeof(ConfigItem) * MAX_CONFIG_SIZE);
        instance->manager->count = 0;
        pthread_mutex_init(&instance->manager->lock, NULL);
        read_config_file("config.txt");
    }
    return instance->manager;
}

int main() {
    ConfigManager* manager = get_config_manager_instance(); // 获取配置管理器单例对象
    const char* value = get_config_value("key1"); // 获取配置项值
    if (value != NULL) {
        printf("key1=%s\n", value);
    }
    pthread_mutex_destroy(&manager->lock); // 销毁互斥锁
    free(manager->items); // 释放配置项数组内存
    free(manager); // 释放配置管理器内存
    free(instance); // 释放配置管理器单例对象内存
    return 0;
}

到此这篇关于利用C++单例模式实现高性能配置管理器的文章就介绍到这了,更多相关C++单例模式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++设计模式之单例模式详解

    目录 单例模式:就是只有一个实例. 单例模式又分为两种基本的情形:饿汉式和懒汉式 如下是懒汉式单例类 小结: 继续看单例模式 总结 单例模式:就是只有一个实例. singleton pattern单例模式:确保某一个类在程序运行中只能生成一个实例,并提供一个访问它的全局访问点.这个类称为单例类.如一个工程中,数据库访问对象只有一个,电脑的鼠标只能连接一个,操作系统只能有一个窗口管理器等,这时可以考虑使用单例模式. 众所周知,c++中,类对象被创建时,编译系统为对象分配内存空间,并自动调用构造函数

  • C++单例模式的实例详解

    单例模式概述 个人认为单例模式是设计模式中最为简单.最为常见.最容易实现,也是最应该熟悉和掌握的模式.且不说公司企业在招聘的时候为了考察员工对设计的了解和把握,考的最多的就是单例模式. 单例模式解决问题十分常见,我们怎样去创建一个唯一的变量(对象)?在基于对象的设计中我们可以通过创建一个全局变量(对象)来实现,在面向对象和面向过程结合的设计范式(如 C++中)中,我们也还是可以通过一个全局变量实现这一点.但是当我们遇到了纯粹的面向对象范式中,这一点可能就只能是通过单例模式来实现了,可能这也正是很

  • C++单例模式的几种实现方法详解

    目录 局部静态变量方式 静态成员变量指针方式 智能指针方式 辅助类智能指针单例模式 通用的单例模板类 总结 局部静态变量方式 //通过静态成员变量实现单例 //懒汉式 class Single2 { private: Single2() { } Single2(const Single2 &) = delete; Single2 &operator=(const Single2 &) = delete; public: static Single2 &GetInst() {

  • C++实现单例模式的方法

    目录 饿汉模式 懒汉模式 锁 + 智能指针 局部静态变量 总结 饿汉模式 类实例化就会占用内存,浪费资源,效率高,不存在线程安全问题. class Singleton{ Singleton() { } static Singleton* m_instance_ptr; public: static Singleton* get_instance() { return m_instance_ptr; } }; Singleton* Singleton::m_instance_ptr = new S

  • C++实现 单例模式实例详解

    设计模式之单例模式C++实现 一.经典实现(非线程安全) class Singleton { public: static Singleton* getInstance(); protected: Singleton(){} private: static Singleton *p; }; Singleton* Singleton::p = NULL; Singleton* Singleton::getInstance() { if (NULL == p) p = new Singleton()

  • 利用C++单例模式实现高性能配置管理器

    代码中,使用了单例模式来创建配置管理器对象,保证了整个程序中只有一个配置管理器对象.配置管理器中包含了配置项数组.配置项数量.互斥锁等成员,通过这些成员来实现配置文件的读取和配置项的获取.在主函数中,获取了一个配置项的值,并打印出来,最后销毁互斥锁.释放内存. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #define MAX_CONFIG_S

  • SQL Server配置管理器无法连接到WMI提供程序

    今天在打开sql server 的时候打不开.报了一个错误,然后我打开sql server配置管理器,就看到了如下图这个错误. 然后就去网上搜了这个问题的解决方法,综合起来有以下几种: 第一种: 给数据库程序network service读取权限即可. C:/Program Files/Microsoft SQL Server/90/Shared给这个目录增加network service权限或者user权限就可以了,当然你加Everyone也行. 这种方法我都不知道怎么操作,不会加. 第二种:

  • 利用Python制作百度图片下载器

    前段时间写了一个百度图片下载器,结果发现有很多人需要使用.说实话之前写的那一款百度图片下载器比较LOW,今天刚好有时间就做了一下升级. 更新了两个BUG,一个是图片下载达到几千张的时候就没有图片可以下载了.另一个是下载进度不能实时的展示出来不知道下载到什么程度了. 同样的,我们先把需要的第三方库导入进来. '''UI界面相关的库''' from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import

  • 利用Python多线程实现图片下载器

    目录 导语 开发工具 环境搭建 原理简介 效果展示 导语 之前有很多小伙伴说想学习一下多线程图片下载器,虽然好像已经过去很久了,不过还是上来安排一波吧.至于题目为什么说是构建一个小型数据集,因为公众号之后的文章应该还会用到它来构建一些简单的图像分类数据集,换句话说,后续一段时间,公众号会主要写一些深度学习机器学习相关的文章,下期文章揭晓具体内容. 废话不多说,让我们愉快地开始近期最后一篇爬虫文章~ 开发工具 Python版本:3.7.8 相关模块: requests模块: alive-progr

  • 利用Python编写本地音乐播放器

    先上完整代码: 修改文件夹路径即可运行 # -*- encoding: utf-8 -*- ''' @Description:       : @Date     :2022/03/24 17:43:26 @Author      :骤&雨 @version      :1.0 ''' #导入相关库文件 import os import tkinter import tkinter.filedialog import random import time import threading imp

  • 利用Python制作简易的点赞器

    目录 本篇博客试用场景 点赞机器人核心逻辑 代码层级的实现 模拟登录 点赞器 总结 在今天,任何一个社区类平台,都具备点赞功能,应运而生的就是自动点赞器,俗称刷分机/刷赞器. 本文将为你介绍一款点赞机器人,最简单易理解的核心逻辑. 全文涉及的伪代码,使用 Python 编写,由于是伪代码的原因,不懂 Python,你也能看懂. 本篇博客试用场景 本次点赞机器人,主要面向电脑上的 Web 站点,不涉及 APP 端. 点赞机器人核心逻辑 模拟点击操作,触发点赞,喜欢等操作. 实现点赞操作前,还有一步

  • 利用Python实现自定义连点器

    目录 前言 整体思路 所有功能 简单演示 点击功能 延时功能 连点功能 存储功能 读取功能 存储导入功能[升级版] 拖拽功能 右击.中击.双击功能的实现 按键功能 滚动滚轮功能 查看功能 执行功能 逻辑判断功能板块 判断功能 判断功能的逻辑代码 逻辑执行功能的实现 完整代码 前言 前些天留意到我妈一直在预约四价疫苗都约不上,就想着写个程序来模拟人的操作去点击,判断疫苗是否被抢完,无限循环去刷新这个页面,一旦疫苗可预约就立马抢下来选择时间接种人.当预约成功后就语音循环播报:已经抢到,赶紧过来看一下

  • Android利用SeekBar实现简单音乐播放器

    一.Demo简介  利用AIDL为Activity绑定服务,利用Handler机制,发送消息更新SeekBar的UI,利用计时器定时更新SeekBar的进度.实现对音乐的开始播放,到暂停,继续,以及停止播放的功能.以及实现拖动进度条播放音乐的功能. 二.AIDL接口  利用AIDL机制提供给MainActivity访问MyMusicService的方法,实现播放暂停等功能. 三.主要类代码 1.MyMusicService package my.com.mymusicp; import andr

  • SQL SERVER 2008 R2配置管理器出现“远程过程调用失败”(0x800706be)错误提示

    以前SQL Server 2008 不能登陆的时候,总是通过"计算机管理"→"SQL Server服务"更改一下,"SQL Server(MSSQLSERVER)".可是现在出现的问题却成了SQL Server服务打不开的情况,很是郁闷.如图: 通过网上查,才知道是因为SQL Server2008 与VS2012 共存的问题,当你电脑中同时装了这两样东西,SQL 就会出现上图中的情况. 解决办法:从控制面板或者其他辅助软件中找到"Mic

  • C# 利用AForge实现摄像头信息采集

    概述 AForge.NET是一个专门为开发者和研究者基于C#框架设计的,提供了不同的类库和关于类库的资源,还有很多应用程序例子,包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,机器人等领域.本文主要讲解利用AForge进行图像采集的相关内容[包括拍照,视频录制],仅供学习分享使用. AForge.Net相关类库介绍 AForge.dll 是框架的核心基础类库,为其他类库提供服务. AForge.Controls.dll 包含AForge.Net的UI控件,主要用于页面显示. A

随机推荐