单例模式-支持并发的C语言实现

代码实现:

cpp 复制代码
c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

// 定义单例对象结构体
typedef struct {
    // 单例对象的数据成员
    int value;
} Singleton;

// 静态变量,用于保存唯一实例的指针
static Singleton* instance = NULL;

// 互斥锁,用于保护临界区
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 获取单例对象的函数
Singleton* getSingleton() {
    // 首先检查实例是否已经存在
    if (instance == NULL) {
        // 对临界区加锁
        pthread_mutex_lock(&mutex);

        // 再次检查实例是否已经被创建
        if (instance == NULL) {
            // 创建单例对象
            instance = (Singleton*) malloc(sizeof(Singleton));
            instance->value = 0;
        }

        // 解锁临界区
        pthread_mutex_unlock(&mutex);
    }

    return instance;
}

// 示例线程函数,对单例对象进行操作
void* threadFunc(void* arg) {
    Singleton* singleton = getSingleton();

    // 模拟对单例对象的操作
    singleton->value += 1;
    printf("Singleton value: %d\n", singleton->value);

    return NULL;
}

int main() {
    // 创建多个线程来同时访问单例对象
    pthread_t thread1, thread2, thread3;
    pthread_create(&thread1, NULL, threadFunc, NULL);
    pthread_create(&thread2, NULL, threadFunc, NULL);
    pthread_create(&thread3, NULL, threadFunc, NULL);

    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    pthread_join(thread3, NULL);

    return 0;
}

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供全局访问点以获取该实例。

优点:

  1. 严格控制实例个数:单例模式可以防止多个实例的创建,确保在整个应用程序中只有一个实例存在。
  2. 全局访问性:由于单例实例通常是全局可访问的,因此可以方便地在应用程序的不同部分使用和调用。
  3. 节约资源:由于单例模式只创建一个实例,可以节约系统资源,例如内存和处理器时间。
  4. 简化配置:单例模式可以将一些需要共享的配置信息集中管理,减少了重复的配置操作。

缺点:

  1. 违反单一职责原则:由于单例模式通常负责创建自己的实例和管理全局状态,可能会导致单例类职责过重,违反了单一职责原则。
  2. 难以扩展和测试:由于单例模式的全局访问性和紧耦合性,对于扩展和测试来说可能会更加困难。因为修改单例类可能会影响到其他依赖它的代码。

适用场景:

单例模式适用于以下场景:

  1. 资源共享:当多个对象需要共享同一资源时,可以使用单例模式来确保只有一个实例提供该资源。
  2. 全局访问:对于需要在系统的多个部分中使用相同实例的情况,单例模式提供了一种方便的方式来访问实例。
  3. 控制对象数量:有些情况下,由于资源限制或性能要求,需要限制某个类只能拥有一个实例。

需要注意的是,使用单例模式时应该慎重考虑,合理评估是否真正需要全局唯一实例。滥用单例模式可能会导致代码复杂性增加,并且可能隐藏了类之间的依赖关系

相关推荐
2401_873479405 小时前
如何利用IP查询定位识别电商刷单?4个关键指标+工具配置方案
开发语言·tcp/ip·php
我爱cope6 小时前
【从0开始学设计模式-10| 装饰模式】
java·开发语言·设计模式
菜鸟学Python6 小时前
Python生态在悄悄改变:FastAPI全面反超,Django和Flask还行吗?
开发语言·python·django·flask·fastapi
浪浪小洋7 小时前
c++ qt课设定制
开发语言·c++
charlie1145141917 小时前
嵌入式C++工程实践第16篇:第四次重构 —— LED模板,从通用GPIO到专用抽象
c语言·开发语言·c++·驱动开发·嵌入式硬件·重构
handler017 小时前
Linux: 基本指令知识点(2)
linux·服务器·c语言·c++·笔记·学习
故事和你917 小时前
洛谷-数据结构1-4-图的基本应用1
开发语言·数据结构·算法·深度优先·动态规划·图论
程序猿编码8 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
aq55356008 小时前
编程语言三巨头:汇编、C++与PHP大比拼
java·开发语言
aq55356009 小时前
PHP vs Python:30秒看懂核心区别
开发语言·python·php