Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题

本文主要内容

  1. 弹出式线程(Pop-up threads)
  2. 使单线程代码多线程化会产生那些问题

一、弹出式线程(Pop-up threads)

以在一个http到达之后一个Service的处理为例子来介绍弹出式线程。

上面的例子中传统的做法有可能是在Service中有一个线程一直在等待request的到达,等request到达后这个线程会开始检查请求最后在进行处理。当这个线程在处理request的时候,后面来的request会被block,一直到线程处理完当前request为止。如下图所示。

弹出式线程的处理方法:当有新的请求到达时,马上创建一个线程去处理这个请求(弹出pop-up thread).

弹出式线程的优势:

  1. 线程是全新的,没有历史,创建很快
  2. request没有被block,请求到达到开始处理之间的延迟非常小

在使用弹出式线程时需要额外考虑一下,这个线程是应该运行在那里比较好。用户空间还是内核空间。将线程放在内核相对会比较容易,但是因为在内核,如果该线程出问题,危害性将比用户空间的线程大。

二、使单线程代码多线程化

一些既有的代码都是基于单线程的,如果将其修改为支持多线程会产生那些后果呢,下面简单一一做一下分析。

2.1 多线程共享变量

图示:

n在t1、t2之间共享:

  1. T1调用Check程序检查自己的状态,得的n=1这个状态
  2. 在T1得到状态使用n之前cpu被调度给了T2。
  3. T2调用Check程序检查自己的状态,得的n=2这个状态
  4. CPU再次被调度到T2,这个时候n已经等于2了,产生了错误的结果。

上面的问题是可以被优化的,让T1和T2取消这个对N的共享,让其各自维护自己的状态码N1,和N2即可避免上述问题。

2.2 重复进入

类似于上面的共享问题,一个Library提供一个功能,在一个线程进入该Library后没有返回之前另外一个线程又进入了,会产生什么问题呢。

比如这个Library在请求没有返回之前将数据放入buffer,那么这个时候另外一个线程进入这个Library会将原有buffer的数据重置,从而对第一个线程的执行造成不可预估的后果。

这种问题可以让Library提供一个标志位,当这个Library处于调用状态时,设置标志位,这样后续的请求将会被block,从而解决问题,但是这会降低程序的并行执行能力。

2.3 信号(中断处理)

  1. 比如一个键盘key down信号,应该有那个线程处理,要不要pop-up一个新的线程
  2. 有多个线程时,如何一个线程修改了信号,要不要同时通知其他线程
  3. 同一个信号,不同线程的处理可能完全不一样,比如ctrl+c,有些线程用于粘贴,有些用于终止程序。

信号的处理在单线程程序中就已经很复杂了,多线程是复杂度加倍。

2.4 堆管理

在很多系统中,当一个进程的堆栈异常时(stackoverflow),内核自动为这个进程分配堆栈,当一个进程有多个线程时,势必会有多个堆栈,当内核没有完全了解所有堆栈,有可能某些堆栈发生堆栈异常时,内核并不知道,无法为其自动分配堆栈。

2.5 all

如果在没有经过大量分析和设计的前提下将多线程引入一个现有的单线程系统会产生很多不可预知的错误,绝不是一个简单的引入多线程机制那么简单,要从Library等各个方面进行分析和设计,确保在线程安全的情况下再引入多线程。后期引入多线程的成本要比刚开始设计就包含多线程要高很多。

Operating System-Thread(5)弹出式线程使单线程代码多线程化会产生那些有关问题相关推荐

  1. vue写js代码_vue.js弹出式音乐播放器特效代码

    码农那点事儿 关注我们,一起学习进步 vue弹出式音乐播放器是一款基于vue.js实现的点击弹出式音乐播放器代码特效,点击图片即可弹出播放界面大图,可切换列表模式,上一首下一首音乐切换等功能. 下载源 ...

  2. pyqt5子窗口跳出主窗口_弹出式窗口与 可用性,转换和跳出率

    pyqt5子窗口跳出主窗口 Written by Cassandra Naji 由卡珊德拉·纳吉 ( Cassandra Naji)撰写 They go by many names - modal w ...

  3. DataGrid分页;指定列的总和和平均值;显示鼠标背景色;弹出式窗口;

    1 在页脚中添加指定列的总和和平均值 private void dgitem_ItemDataBound() {    if(e.Item.ItemIndex >=0)      {       ...

  4. c#桌面应用程序如何添加弹出式广告

    2019独角兽企业重金招聘Python工程师标准>>> c#写的软件很多,如何添加诸如像搜狗输入法软件与灵格斯翻译软件的屏幕右下角弹出式广告呢. c#代码如下: using Syst ...

  5. c#应用程序如何添加弹出式广告功能

    使用c#语言,如何实现像搜狗输入法以及灵格斯翻译软件的屏幕右下角弹出式广告呢? c#code如下: using System; using System.Collections.Generic; us ...

  6. Ajax弹出式无刷新城市选择特效

    为什么80%的码农都做不了架构师?>>>    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional// ...

  7. 5弹出阴影遮罩_千文详述Cocos Creator弹出式对话框实现技术,着实硬核

    正文 在Cocos Creator游戏开发中,经常需要使用到弹出式对话框,下面我们就一起来封装下自己的弹出式对话框. 一.弹出式对话框原理解析 1:对话框的结构: 1. `根节点 -->`2. ...

  8. 自动弹窗被拦截 html,弹出式窗口被阻止怎么办,如何阻止弹出式窗口

    很多人看到"弹出式窗口"这个名词时想必会有所疑惑,弹出与固定式窗口究竟有何不同呢?其实我们在浏览网页的时候就会发现许多弹出式窗口,这种窗口主要应用于广告类,许多商家会为各种大小网页 ...

  9. 弹出确定_Redmi K30 Pro再剧透:弹出式全面屏,没有高刷

    近日,Redmi红米手机正式宣布了新机Redmi K30 Pro的发布计划,正在进行发布前的新机预热.今天Redmi红米手机再次公布了Redmi K30 Pro的紫色配色方案.与前两款配色一样,这款新 ...

最新文章

  1. “看墙之外” ——遮挡下的人体姿态估计
  2. 逻辑差学计算机,数学差的人不配学计算机?布朗大学教授告诉你一毛钱关系都没有!...
  3. maven book
  4. ubuntu 中 ROS 一些报错的解决
  5. 从0开始架构一个IOS程序——03 — -分包用添加pch全局引用文件
  6. 基于IHttpAsyncHandler的TCP收发器
  7. C#匿名委托,匿名函数,lambda表达式
  8. vb6 控件未注册问题解决
  9. eclipse安装Spring插件
  10. 联想 M7600d 激光一体机清零方法
  11. ImageAI的介绍(1)
  12. 判断矩形相似C语言,C++判断矩形相交的方法
  13. Ubuntu 系统备份为ISO
  14. 几个常见网络故障修复命令
  15. Python使用psutil的电脑资源监控软件
  16. 一句话证明你在阿里待过!(这才是最真实的阿里)
  17. 获取当前时间戳-在线时间戳转换工具
  18. Python_小林的爬取QQ空间相册图片链接程序
  19. VPS云服务器搭建FTP并连接
  20. 匿名带你从零开始做四轴-第二期--四轴的硬件组成

热门文章

  1. 世界机器人冠军王宇航_★​身边的榜样,为你喝彩:我校学子摘冠第七届河南省VEX U机器人挑战赛...
  2. bing搜索php,PHP 使用bing搜索网站的api封装类用法
  3. 计算机专业带给我们的启示,一次电脑网络调查带给我的启示
  4. 【渝粤教育】国家开放大学2018年秋季 1344T金融风险管理 参考试题
  5. 王者体验服服务器注册人数已满,王者荣耀体验服注册人数达到上限怎么回事?体验服测试最新申请方法...
  6. es6 遍历数组对象获取所有的id_ES6对象遍历Object.keys()方法
  7. [精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡
  8. [精品]CSAPP Bomb Lab 解题报告(五)
  9. 最基础!MySQL基础查询SELECT
  10. java小程序 2048_微信小程序之游戏2048