博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言实现简单的单例模式
阅读量:2031 次
发布时间:2019-04-28

本文共 2008 字,大约阅读时间需要 6 分钟。

单例模式就是在程序运行过程中只存在此“对象”的一个“实例”,C语言实现单例模式就是简单的运用static全局变量。

我们的学号在教务系统中无论在任何地点进行任何操作,只会影响到对应学号的数据库内容,比如你在两台电脑上先后修改了你的名字,如下:

#include 
#include
#include
#include
typedef struct ID{ char *name; int score; } id;static id * _id = NULL;id *getInstance(){ if(_id != NULL) return _id; else { _id = (id*)malloc(sizeof(id)); assert(_id != NULL); return _id; }}int main(){ id* i1 = getInstance() ; i1->name = "Rong"; id* i2 = getInstance() ; i2->name = "Tao"; if(i1 == i2) fprintf(stdout, " i1 == i2 \n"); fprintf(stdout, "i1->name = %s\n",i1->name); fprintf(stdout, "i2->name = %s\n",i2->name); return 0 ;}

上面的代码中显示了如何建立单例对象,其输出的结果:

$ ./a.out  i1 == i2 i1->name = Taoi2->name = Tao

但是,在上面的代码中存在一定的隐患,如果在两台电脑上同时进行修改用户名的操作,那么就可能会造成不同线程之间的等待从而导致死锁,所以需要进一步修改代码:

#include 
#include
#include
#include
#include
typedef struct ID{ char *name; int score; } id;static id * _id = NULL;static omp_lock_t lock;id *getInstance(){ omp_set_lock(&lock); if(_id != NULL) { omp_unset_lock(&lock); return _id; } else { _id = (id*)malloc(sizeof(id)); assert(_id != NULL); omp_unset_lock(&lock); return _id; }}int main(){ omp_set_num_threads(20); id * i1, *i2; omp_init_lock(&lock); #pragma omp parallel { i1 = getInstance() ; i1->name = "Rong"; i1->score = omp_get_thread_num(); } #pragma omp parallel { i2 = getInstance() ; i2->name = "Tao"; } omp_destroy_lock(&lock); if(i1 == i2) fprintf(stdout, " i1 == i2 \n"); fprintf(stdout, "i1->name = %s, i1->score = %d\n",i1->name, i1->score); fprintf(stdout, "i2->name = %s, i2->score = %d\n",i2->name, i2->score); return 0 ;}

编译与运行:

$ gcc main2.c -fopenmp$ ./a.out  i1 == i2 i1->name = Tao, i1->score = 7i2->name = Tao, i2->score = 7

转载地址:http://omvaf.baihongyu.com/

你可能感兴趣的文章
【Java】【25】去除空格
查看>>
【其他】【PL/SQL Developer】【2】报错Initialization error Could not load ".../oci.dll"解决方法...
查看>>
【Java】【28】提高List的removeAll方法的效率
查看>>
【JS】【28】让输入框只能输入正整数
查看>>
【记录】【4】各种工具
查看>>
【JS】【31】读取json文件
查看>>
Ubuntu Boost 编译
查看>>
MySQL中的行级锁,表级锁,页级锁
查看>>
ORACLE 修改SID
查看>>
OpenCV模块分析(转)
查看>>
聊聊我对写好程序的认识
查看>>
OpenSSL源代码学习[转]
查看>>
插件原理2[转自CSDN]
查看>>
COM编程快速入门[转自VCbase]
查看>>
VBA得到word中的超链接
查看>>
ComBSTR的使用
查看>>
硬回车与软回车[转]
查看>>
OpenCV Windows7 VC6.0安装以及HelloWorld
查看>>
python升级导致yum命令无法使用的解决办法
查看>>
vi/vim 中如何在每行行首或行尾插入指定字符串
查看>>