当前位置: 首页 > news >正文

【lesson59】线程池问题解答和读者写者问题

文章目录

  • 线程池问题解答
    • 什么是单例模式
    • 什么是设计模式
    • 单例模式的特点
    • 饿汉和懒汉模式的理解
    • STL中的容器是否是线程安全的?
    • 智能指针是否是线程安全的?
    • 其他常见的各种锁
  • 读者写者问题

线程池问题解答

什么是单例模式

单例模式是一种 “经典的, 常用的, 常考的” 设计模式.

什么是设计模式

IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让我们这些菜鸡们不太拖大佬的后腿, 于是大佬们针对一些经典的常见的场景, 给定了一些对应的解决方案, 这个就是设计模式

单例模式的特点

某些类,只应该具有一个对象(实例), 就称之为单例.
例如一个男人只能有一个媳妇.
在很多服务器开发场景中, 经常需要让服务器加载很多的数据 (上百G) 到内存中. 此时往往要用一个单例的类来管理这些数据.

饿汉和懒汉模式的理解

吃完饭立刻洗碗, 这种就是饿汉方式.因为下一顿吃的时候可以立刻拿着碗就能吃饭.
吃完饭, 先把碗放下, 然后下一顿饭用到这个碗了再洗碗, 就是懒汉方式
懒汉方式最核心的思想是 “延时加载”. 从而能够优化服务器的启动速度.
有兴趣的可以去我C++专栏看一看设计模式。

STL中的容器是否是线程安全的?

不是.
原因是, STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响.
而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶).
因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全

智能指针是否是线程安全的?

对于 unique_ptr, 由于只是在当前代码块范围内生效, 因此不涉及线程安全问题.
对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题. 但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数.

其他常见的各种锁

悲观锁:在每次取数据时,总是担心数据会被其他线程修改,所以会在取数据前先加锁(读锁,写锁,行锁等),当其他线程想要访问数据时,被阻塞挂起。

乐观锁:每次取数据时候,总是乐观的认为数据不会被其他线程修改,因此不上锁。但是在更新数据前,会判断其他数据在更新前有没有对数据进行修改。主要采用两种方式:版本号机制和CAS操作。

CAS操作:当需要更新数据时,判断当前内存值和之前取得的值是否相等。如果相等则用新值更新。若不等则失败,失败则重试,一般是一个自旋的过程,即不断重试。

自旋锁,公平锁,非公平锁?
自旋锁:本质就是通过不断检测锁状态来进行资源是否就绪的方案。

读者写者问题

读者和写者-----互斥、同步
写者和写者------互斥、竞争
读者和读者-------共享

读者和写者其实也是一种生产者消费者模型,只不过读者写者问题中读者的优先级高于写者,只要有一个读者在,写者就不能写,因为容易因为时序问题导致读取会错意。同样的如果写者在读者就不能去读,得等写者写完,读者才能去读。

读者写者问题应用场景:数据被读取的频率非常高,而被修改的频率特别低。

读写锁
在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比较少。相比较改写,它们读的机会反而高的多。通常而言,在读的过程中,往往伴随着查找的操作,中间耗时很长。给这种代码段加锁,会极大地降低我们程序的效率。那么有没有一种方法,可以专门处理这种多读少写的情况呢? 有,那就是读写锁。[长时间等人和短时间等人的例子]

在这里插入图片描述

http://www.lryc.cn/news/304740.html

相关文章:

  • 【LeetCode每日一题】单调栈316去除重复字母
  • 【Git】Gitbash使用ssh 上传本地项目到github
  • activeMq将mqtt发布订阅转成消息队列
  • Go语言教程
  • 分布式锁的应用场景及实现
  • 嵌入式Linux中apt、apt-get命令用法汇总
  • Unity之ShaderGraph如何实现水面波浪
  • 无线局域网(WLAN)简单概述
  • 学习数仓工具 dbt
  • 高录用快见刊【最快会后两个月左右见刊】第三届社会科学与人文艺术国际学术会议 (SSHA 2024)
  • C语言-指针初学速成
  • MQL语言实现单元测试
  • Redis信创平替之TongRDS(东方通),麒麟系统安装步骤
  • nginx服务
  • 多数pythoneer只知有列表list却不知道python也有array数组
  • 【Rust】——控制流(if-else,循环)
  • 通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试
  • 费舍尔FISHER金属探测器探测仪维修F70
  • Airtest-Selenium实操小课③:下载可爱猫猫图片
  • Druid无法登录监控页面
  • 【Linux系统化学习】深入理解匿名管道(pipe)和命名管道(fifo)
  • 信息学奥赛一本通1209:分数求和
  • LabVIEW储氢材料循环寿命测试系统
  • Unity3D 框架如何搭建基于纯Lua的U框架与开发模式详解
  • Linux常见指令(2)
  • 【C++】封装
  • Maxwell安装部署
  • 说一下JVM类加载机制?
  • 解决SpringAMQP工作队列模型程序报错:WARN 48068:Failed to declare queue: simple.queue
  • mysql在服务器中的主从复制Linux下