c语言中有单例模式么?单例的演化模式 是否为,单线程--多线程--分布式

shiter
人工智能领域优质创作者
博客专家认证
2017-11-25 07:27:41

网上找了个c语言的单例模式,c语言有单例这一概念么?

#ifndef CSINGLETON_H
#define CSINGLETON_H

#include <stdlib.h>

typedef struct {
void* (*ctor)(void *_self);
void* (*dtor)(void *_self);
void* (*createInstance)(void *self);
void *instance;
} _CSingleton;

extern const void *CSingleton;

void *GetInstance(void);

#endif

csingleton.c
[cpp] view plain copy
#include "csingleton.h"
#include <stdlib.h>

static void *csingletonCtor(void *_self) {
_CSingleton *self = _self;

self->instance = _self;

return self;
}

static void *csingletonDtor(void *_self) {
_CSingleton *self = _self;

self->instance = NULL;

return self;
}

static void *csingletonCreateInstance(void *_self) {
_CSingleton *self = _self;

self->instance = _self;

return self;
}

static _CSingleton _csingleton = {
csingletonCtor, csingletonDtor, csingletonCreateInstance, NULL
};

const void *CSingleton = &_csingleton;

void *GetInstance(void) {
if (NULL == ((_CSingleton*)CSingleton)->instance) {
return csingletonCtor(CSingleton);
} else {
return ((_CSingleton*)CSingleton)->instance;
}
}

main.c
[cpp] view plain copy
#include "csingleton.h"
#include <stdio.h>

int main(int argc, char *argv[]) {
void *ps1 = GetInstance();
void *ps2 = GetInstance();

if (ps1 == ps2) {
fprintf(stdout, "ps1 = ps2\n");
}
return 0;
}


...全文
572 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiter 2017-12-02
  • 打赏
  • 举报
回复
引用 16 楼 wangyaninglm 的回复:

typedef int *SINGLETON;   /* 定义自己的类型 */
SINGLETON *singleton = NULL;
pthread_mutex_t singleton_lock=PTHREAD_MUTEX_INITIALIZER;
SINGLETON *init_singleton(void)
{
    pthread_mutex_lock(&singleton_lock);
    if (NULL == singleton)
    {
        singleton = calloc(1, sizeof(SINGLETON));
        if (NULL == singleton)
        {
            pthread_mutex_unlock(&singleton_lock);
            return NULL;
        }
        /*  SINGLETON 初始化 */
    }
    pthread_mutex_unlock(&singleton_lock);
    return  singleton;
}
单例适用场景: 在模块化设计时,应该遵循耦合度越低越好,但是总是存在一些公共的调用函数库或者模块,这些公共的调用函数库或者模块有以下几个特点: 1、需要被其他的模块使用 2、其他模块之间并不知道对方使用会去调用或者初始化 3、公共的调用函数库或者模块却希望在整个系统中初始化一次。 这种模块其实也很常见, 比如:线程池(整个系统希望只有那么线程,其他模块不能线程)。 再比如:内存池,整个系统中只能存在这么一个内存池。
shiter 2017-12-02
  • 打赏
  • 举报
回复

typedef int *SINGLETON;   /* 定义自己的类型 */
SINGLETON *singleton = NULL;
pthread_mutex_t singleton_lock=PTHREAD_MUTEX_INITIALIZER;
SINGLETON *init_singleton(void)
{
    pthread_mutex_lock(&singleton_lock);
    if (NULL == singleton)
    {
        singleton = calloc(1, sizeof(SINGLETON));
        if (NULL == singleton)
        {
            pthread_mutex_unlock(&singleton_lock);
            return NULL;
        }
        /*  SINGLETON 初始化 */
    }
    pthread_mutex_unlock(&singleton_lock);
    return  singleton;
}
shiter 2017-12-01
  • 打赏
  • 举报
回复
引用 14 楼 zjq9931 的回复:
[quote=引用 13 楼 zjq9931 的回复:] [quote=引用 12 楼 wangyaninglm 的回复:] 全局唯一id和单例模式的区别联系是啥?
全局唯一Id和单例模式的相同点:全局只操作一个实例。 全局唯一Id是全局可见的,任意一个地方都可以修改。单利模式不是全局可见,要想操作必须先通过获取语句来获取。 多线程的时候同步封装,单例模式相对的比较容易实现封装。 全局唯一Id只能通过制度来规定唯一性,不能通过编译器来限定唯一性。单例模式是通过编译器来限定唯一性的。 构造函数私有,构造对象为static类型,只能有一个。 [/quote] 说的不全或者有问题的地方,请指正。[/quote] http://blog.csdn.net/wangyaninglm/article/details/78658318 找到一些资料,未完待续
  • 打赏
  • 举报
回复
引用 13 楼 zjq9931 的回复:
[quote=引用 12 楼 wangyaninglm 的回复:] 全局唯一id和单例模式的区别联系是啥?
全局唯一Id和单例模式的相同点:全局只操作一个实例。 全局唯一Id是全局可见的,任意一个地方都可以修改。单利模式不是全局可见,要想操作必须先通过获取语句来获取。 多线程的时候同步封装,单例模式相对的比较容易实现封装。 全局唯一Id只能通过制度来规定唯一性,不能通过编译器来限定唯一性。单例模式是通过编译器来限定唯一性的。 构造函数私有,构造对象为static类型,只能有一个。 [/quote] 说的不全或者有问题的地方,请指正。
  • 打赏
  • 举报
回复
引用 12 楼 wangyaninglm 的回复:
全局唯一id和单例模式的区别联系是啥?
全局唯一Id和单例模式的相同点:全局只操作一个实例。 全局唯一Id是全局可见的,任意一个地方都可以修改。单利模式不是全局可见,要想操作必须先通过获取语句来获取。 多线程的时候同步封装,单例模式相对的比较容易实现封装。 全局唯一Id只能通过制度来规定唯一性,不能通过编译器来限定唯一性。单例模式是通过编译器来限定唯一性的。 构造函数私有,构造对象为static类型,只能有一个。
赵4老师 2017-11-28
  • 打赏
  • 举报
回复
离开操作系统,不要谈单例模式。 《Windows核心编程》
  • 打赏
  • 举报
回复
引用 8 楼 zjq9931 的回复:
引用 4 楼 wangyaninglm 的回复:
c里面搞出个单例,干什么用呢?
单例模式,我个人认为就是全局变量的一种优雅的实现方式。 可以通过一个函数获取到一个实例的指针,或者引用。[/quote] 当然我说的很片面,单例模式有很多全局变量所没有的优点,比如封装同步等等很多优点。 https://www.cnblogs.com/xiangshancuizhu/archive/2012/11/03/2752156.html http://blog.csdn.net/ozdazm/article/details/8538014
  • 打赏
  • 举报
回复
引用 4 楼 wangyaninglm 的回复:
c里面搞出个单例,干什么用呢?
[/quote] 单例模式,我个人认为就是全局变量的一种优雅的实现方式。 可以通过一个函数获取到一个实例的指针,或者引用。
shiter 2017-11-28
  • 打赏
  • 举报
回复
全局唯一id和单例模式的区别联系是啥?
引用 10 楼 cfjtaishan 的回复:
没怎么研究过单例模式,可以参考一下别人的: http://cantellow.iteye.com/blog/838473 https://baike.baidu.com/item/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/5946627?fr=aladdin http://blog.chinaunix.net/uid-22291256-id-3486413.html
引用 8 楼 zjq9931 的回复:
引用 4 楼 wangyaninglm 的回复:
c里面搞出个单例,干什么用呢?
单例模式,我个人认为就是全局变量的一种优雅的实现方式。 可以通过一个函数获取到一个实例的指针,或者引用。[/quote]
真相重于对错 2017-11-26
  • 打赏
  • 举报
回复
看你的问题,让我想起了马大师关于臭虫药的相声
shiter 2017-11-26
  • 打赏
  • 举报
回复
引用 6 楼 hdt 的回复:
看你的问题,让我想起了马大师关于臭虫药的相声
why
shiter 2017-11-25
  • 打赏
  • 举报
回复
引用 1 楼 Intel0011 的回复:
单例模式是设计模式里的概念,是独立于语言的,很多语言都可以实现单例模式,C语言也可以,只是优雅程度不高 单例模式是限制只生成一个实例,单线程--多线程--分布式是另外的概念
单线程--多线程--分布式 应该有自己对应的单例实现
shiter 2017-11-25
  • 打赏
  • 举报
回复
引用 2 楼 hdt 的回复:
c里面搞出个单例,干什么用呢?
xian_wwq 2017-11-25
  • 打赏
  • 举报
回复
看过一个单例模式的写法 核心是使用锁实现多线程同步, 使用barrier()或者volatile,防止编译时内存乱序访问
真相重于对错 2017-11-25
  • 打赏
  • 举报
回复
c里面搞出个单例,干什么用呢?
Intel0011 2017-11-25
  • 打赏
  • 举报
回复
单例模式是设计模式里的概念,是独立于语言的,很多语言都可以实现单例模式,C语言也可以,只是优雅程度不高 单例模式是限制只生成一个实例,单线程--多线程--分布式是另外的概念

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧