- 博客(7)
- 收藏
- 关注
原创 无锁队列ringbuff实现以及性能
以上场景对于有锁队列和无锁队列都可以使用的,但还如果对性能要求比较高,比如需要达到上万ops,就可以考虑优先使用无锁队列。相反如果性能达不到这么高使用有锁队列和无锁队列性能差别并不大,但是有锁队列实现会更加简单。以同样的数据结构(环形队列)实现一个有锁的队列,进行对比测试,两者的区别就在于一个加锁一个无锁,消费者在取出数据后会进行1000 次 empty loop。系统:Debian x86_64虚拟机,4核4G。本文采用的是循环队列的实现方式。
2023-06-29 16:37:36
494
1
原创 常用设计模式-工厂模式
工厂模式分为简单工厂模式工厂方法模式和抽象工厂模式三类,其中工厂方法和抽象工厂模式的定义和结构图如下,简单工厂模式在后面的实例中给出当一个类不知道它所需要的对象的类时,在工厂方法模式中,不需要知道具体产品类的类名,只需要知道所对应的工厂即可当一个类希望通过其子类来指定创建对象时在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。
2023-06-06 19:22:08
124
原创 常用设计模式-单例模式
这里声明了一个Single的单例类,类中有两个与其它类不同的地方,一个就是它的构造函数是私有的,这样做的目的就是防止外界调用构造函数,而只要外界不能调用构造函数那么就不能对该类进行实例化(类内可以访问私有的构造函数所以只能类内实例化)。:某些情况下,造成内存浪费,因为对象未被使用的情况下就会被初始化,如果一个项目中的类多达上千个,在项目启动的时候便开始初始化可能并不是我们想要的。的时候确保当前的对象时没有被实例过的,因为上锁操作对性能是有影响的,所以这里会有一个双重的判定。而这只是单例类的一种懒汉式写法。
2023-06-06 17:54:39
138
原创 C++内存序、屏障和原子操作
其中,std::atomic_thread_fence和std::atomic_signal_fence是用于控制内存访问顺序的栅栏,std::thread::join是用于等待其他线程完成的栅栏。保证该操作之前写入的值对其它线程都是可见,这和写屏障功能很像:把CPU高速缓存中的数据同步到主存和其它CPU高速缓存中(其实是发送了一个更新指令消息到其它CPU的invalidate queue中),即该操作写入一个值后其它线程读取该值一定是之前写入的值,满足可见性。
2023-06-06 15:52:53
596
原创 虚拟内存原理介绍
我们知道系统中的所有进程都是共享CPU和主存资源,但这样就会存在一个问题,这么多进程怎么知道主存上的一块内存是已分配给了其它进程还是空闲状态。所有我们需要一种机制来专门负责操作系统上内存资源的管理,而虚拟内存就充当这样一个角色。虚拟内存是操作系统提供的一种内存管理技术,是对主存的一种抽象。由硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。
2023-05-26 22:39:23
844
1
原创 线程池C和C++语言实现
当并发数很多的时候,并且每个线程执行时间很短的任务,这样就会频繁创建线程,而这样的频繁创建和销毁线程会大大降低系统的执行效率。对于这种场景我们可以使用线程池来复用之前创建的线程,降低线程的频繁创建和销毁工作,达到提高执行效率的目的。
2023-05-25 14:04:21
280
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人