Redis分布式锁

Redis的常见使用场景有这么几种: 通用缓存 计数器(点击量、下载量、pv、uv等) 分布式锁 这里我们主要谈Redis分布式锁的实现。 分布式锁主要是为了解决以下几个问题: 互斥性:多个机器不能同时获得锁,同一时刻只有一台机器占有锁 安全性:保证加锁和解锁都是同一台机器,不能误释放别人的...

2019-08-08 20:32:30

阅读数 44

评论数 0

Golang中的nil

之前在学习C/C++时,我们知道有NULL 在C中NULL是一个(void*)的指针,其定义如下: #define NULL ((void *)0) 而在C++中,NULL直接可以和0划等号,定义: /* Define NULL pointer value */ #ifndef NULL ...

2019-07-25 15:32:32

阅读数 11

评论数 0

取余和取模

之前我的认知里一直以为取余和取模是一回事,直到那天他们在讨论关于这个,才意识到并不是这样,这里进行总结一下。 在数学里面,我们接触到的余数都是大于0的,但在编程中,就会存在有正有负的情况。编程中,这两种计算的机制不同,Mod采用fix函数,Rem采用floor函数,这两函数都是用来取整的,fix向...

2019-07-25 10:37:08

阅读数 7

评论数 0

细说new和delete

C++对C是兼容的,所以C中的动态内存管理机制malloc/free在C++中可以继续使用 为了进行完善,C++也提出了自己的一套内存管理方式:使用new和delete对动态内存进行管理。 使用方式: 1.申请单个数据的空间 类型名 *p1=new 类型名; //申请 delete p1;...

2018-08-20 08:25:22

阅读数 56

评论数 0

malloc的底层实现原理

首先了解内存分配: 一些全局变量、static变量是在编译期间就为他们分配好内存空间的,他们都被放在静态存储区,生命周期随进程。 局部变量是在程序运行期间才为他们分配空间,在栈上进行分配,一旦离开该局部作用域,栈上变量即会被销毁,栈上空间有限。 程序运行时我们使用malloc/new申请的空间...

2018-08-19 10:23:00

阅读数 402

评论数 0

内联函数和宏

当我们写了一个小函数,函数体只有一两行代码,但是该函数被频繁调用,函数调用有一定的开销,要保存上下文,维护函数栈帧,进行参数拷贝,执行结束还要跳转回去,恢复原现场继续执行等进行一系列工作。为了节省开销,我们首先想到的是使用宏函数来代替,这样确实可以,但是注意宏有很多缺点。 宏的概念: 宏定义将...

2018-08-19 00:32:52

阅读数 43

评论数 0

操作符重载

操作符重载的实质是函数重载,C++预定义的操作符的操作对象只能是基本的数据类型,而对于我们用户自定义的类型如类类型也需要类似的运算操作,此时就需要重新定义这些这些运算符,赋予他们新功能,使他在特定的时候执行特定的操作,可以提高代码的可读性。 它的一般格式为: 返回值类型 oprerato...

2018-08-18 19:00:44

阅读数 148

评论数 0

深拷贝和浅拷贝

定义一个string类,未显式给出它的拷贝构造函数 class string { public: string(const char* str="") :_str(new char[strlen(str)+1]) { ...

2018-08-18 18:01:45

阅读数 72

评论数 0

空类中都有哪些东西

定义一个空类,里面什么内容都没有 class A { }; 想想看,它的大小应该是多少?? 要计算一个类对象的大小,要知道这么几点: 类大小是非静态数据成员的类型大小之和 若类中定义了虚函数,需要考虑到虚表指针也占用类对象的内存空间(32位机器下占用四字节) 编译器为了提高存取效率,...

2018-08-18 16:56:25

阅读数 661

评论数 0

const关键字

C中的const const限定一个变量不允许被改变 const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。 相比于define定义的变量,const变量多了类型检查,使程序更加安全,而define仅仅是简单的文本替换,有时候会出现一些错误。 const可以保护被修饰的...

2018-08-16 19:27:32

阅读数 29

评论数 0

static关键字

static: 在C中我们知道,static作为一个关键字,既能修饰变量,也能修饰函数 1.修饰变量 若修饰局部变量,会改变他的生命周期,出了它现在所处的作用域,也不会被销毁,因为此时它已经不是存储在栈上,而是存在数据段上,数据段上的内容只有进程结束才会被销毁,但它的作用域不会被改变,还是...

2018-08-16 17:23:48

阅读数 45

评论数 0

单例模式——C++版

单例模式是什么?? 单例模式(Singleton)是一种常用的设计模式,它能够保证系统中应用该模式的类只有一个实例。 为什么要存在单例模式?? 在很多场景下,我们都希望一个类只能创建出唯一的对象,例如windows下的任务管理器,我们就只能打开一个。若不使用单例模式,就会在多次打开时弹出...

2018-08-16 14:14:44

阅读数 52

评论数 0

守护进程

先了解一些基本概念: 进程组: 一个或多个进程的集合,如父子进程或者通过管道连接起来的进程等这些都同属一个进程组。进程组id一般都是该进程组的组长id。 进程组中所有进程死亡,进程组才算结束。 ctrl+c 发送信号,发送给的是进程组,组内所有进程都会退出 ctrl+c信号不能发给后台进...

2018-08-11 13:00:48

阅读数 224

评论数 0

一个简单小程序

实现这么一个程序: 从磁盘上读取文件,对文件内容解析,解析出两个加数,生成一个可以执行加法运算的动态库,调用该动态库进行加法计算,再将计算结果写入共享内存,然后创建子进程,子进程进行程序替换,替换的程序要完成的任务就是将共享内存中的内容重新写回磁盘上的该文件,记得使用共享内存时要借助信号量保证互...

2018-08-11 11:02:36

阅读数 504

评论数 0

一些常用命令整理

文件相关 readelf: 用来显示一个或者多个elf格式的目标文件的信息 ELF格式的文件: 动态库( 用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像) .o 文件(可重定位的ELF格式文件)( 用户和其他目标文件一起...

2018-08-09 21:59:15

阅读数 98

评论数 0

竞态条件和sigsupend函数

竞态条件(race condition)是一个在设备或者系统试图同时执行两个操作的时候出现的不希望的状况,但是由于设备和系统的自然特性,为了正确地执行,操作必须按照合适顺序进行。  好比我们在模拟实现sleep()函数时 #include <stdio.h&am...

2018-08-09 11:55:59

阅读数 100

评论数 0

线程池

创建线程比起创建进程确实开销少了很多,若有大量任务,且执行时间都非常短暂,那么频繁创建新线程又很快销毁也十分影响性能。智慧的程序员们就想到了借助线程池来解决这样的问题。线程池中的一堆线程当有任务到来时就去执行,执行结束也不着急销毁,坐等下个任务的到来。这样就省下了一大笔创建销毁过程的开销 1.线...

2018-08-08 16:11:55

阅读数 19

评论数 0

生产者消费者模型——基于Posix信号量和互斥量

这种方式可以用信号量初值来定义仓库大小,循环生产和消费 生产者: while(1) { pthread_mutex_lock(&mutex); sem_wait(&sem_full); 生产 sem_post(...

2018-08-06 09:41:34

阅读数 30

评论数 0

多线程中的锁机制

由于多线程之间是并发执行的,而系统调度又是随机的,因此在写多线程程序时会出现很多问题,这时就免不了要用到各种锁机制来保证线程安全且按我们的意愿正确执行。 互斥锁 1.定义一个互斥量 pthread_mutex_t mutex; 2.初始化互斥量 静态分配 pthread_mut...

2018-08-04 20:30:49

阅读数 3682

评论数 0

关于线程

Linux下多线程 线程概念: 一个程序中的一条执行路线就叫做线程。线程是“一个进程内部的控制序列“。 典型的UNIX可以看成只有一个控制线程:一个进程在同一时刻只做一件事,有了控制线程后,在程序设计时可以把进程设计成在同一时刻做多件事,每个线程处理各自独立的任务。 一个进程至少都有一个线...

2018-08-04 15:03:48

阅读数 22

评论数 0

提示
确定要删除当前文章?
取消 删除