Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题
本文主要内容
- 弹出式线程(Pop-up threads)
- 使单线程代码多线程化会产生那些问题
一、弹出式线程(Pop-up threads)
以在一个http到达之后一个Service的处理为例子来介绍弹出式线程。
上面的例子中传统的做法有可能是在Service中有一个线程一直在等待request的到达,等request到达后这个线程会开始检查请求最后在进行处理。当这个线程在处理request的时候,后面来的request会被block,一直到线程处理完当前request为止。如下图所示。
弹出式线程的处理方法:当有新的请求到达时,马上创建一个线程去处理这个请求(弹出pop-up thread).
弹出式线程的优势:
- 线程是全新的,没有历史,创建很快
- request没有被block,请求到达到开始处理之间的延迟非常小
在使用弹出式线程时需要额外考虑一下,这个线程是应该运行在那里比较好。用户空间还是内核空间。将线程放在内核相对会比较容易,但是因为在内核,如果该线程出问题,危害性将比用户空间的线程大。
二、使单线程代码多线程化
一些既有的代码都是基于单线程的,如果将其修改为支持多线程会产生那些后果呢,下面简单一一做一下分析。
2.1 多线程共享变量
图示:
n在t1、t2之间共享:
- T1调用Check程序检查自己的状态,得的n=1这个状态
- 在T1得到状态使用n之前cpu被调度给了T2。
- T2调用Check程序检查自己的状态,得的n=2这个状态
- CPU再次被调度到T2,这个时候n已经等于2了,产生了错误的结果。
上面的问题是可以被优化的,让T1和T2取消这个对N的共享,让其各自维护自己的状态码N1,和N2即可避免上述问题。
2.2 重复进入
类似于上面的共享问题,一个Library提供一个功能,在一个线程进入该Library后没有返回之前另外一个线程又进入了,会产生什么问题呢。
比如这个Library在请求没有返回之前将数据放入buffer,那么这个时候另外一个线程进入这个Library会将原有buffer的数据重置,从而对第一个线程的执行造成不可预估的后果。
这种问题可以让Library提供一个标志位,当这个Library处于调用状态时,设置标志位,这样后续的请求将会被block,从而解决问题,但是这会降低程序的并行执行能力。
2.3 信号(中断处理)
- 比如一个键盘key down信号,应该有那个线程处理,要不要pop-up一个新的线程
- 有多个线程时,如何一个线程修改了信号,要不要同时通知其他线程
- 同一个信号,不同线程的处理可能完全不一样,比如ctrl+c,有些线程用于粘贴,有些用于终止程序。
信号的处理在单线程程序中就已经很复杂了,多线程是复杂度加倍。
2.4 堆管理
在很多系统中,当一个进程的堆栈异常时(stackoverflow),内核自动为这个进程分配堆栈,当一个进程有多个线程时,势必会有多个堆栈,当内核没有完全了解所有堆栈,有可能某些堆栈发生堆栈异常时,内核并不知道,无法为其自动分配堆栈。
2.5 all
如果在没有经过大量分析和设计的前提下将多线程引入一个现有的单线程系统会产生很多不可预知的错误,绝不是一个简单的引入多线程机制那么简单,要从Library等各个方面进行分析和设计,确保在线程安全的情况下再引入多线程。后期引入多线程的成本要比刚开始设计就包含多线程要高很多。
Operating System-Thread(5)弹出式线程&&使单线程代码多线程化会产生那些问题的更多相关文章
- asp.net 弹出式日历控件 选择日期 Calendar控件
原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...
- PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框
零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提 ...
- web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)
这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...
- web开发实战--弹出式富文本编辑器的实现思路和踩过的坑
前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...
- ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法
Ionic中[弹出式窗口]有两种(如下图所示),$ionicModal和$ionicPopup; $ionicModal是完整的页面: $ionicPopup是(Dialog)对话框样式的,直接用Ja ...
- php弹出式登录窗口并获得登录后返回值
一款bootstrap样式结合php制作的弹出式登录窗口,输入用户名和密码后,ajax传参给后台,并获得登录后返回值. hwLayer+ajax弹出登录框 $(function() { $('#for ...
- 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面
其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...
- 【转】PyQt弹出式对话框的常用方法及标准按钮类型
pyQt之弹出式对话框(QMessageBox)的常用方法及标准按钮类型 一.控件说明 QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈,且每 ...
- JS框架_(JQuery.js)Tooltip弹出式按钮插件
百度云盘 传送门 密码:7eh5 弹出式按钮效果 <!DOCTYPE html> <html > <head> <meta charset="UTF ...
随机推荐
- java并发编程基础---Sky
1.线程及启动和终止 1.1 线程 -进程/优先级 操作系统调度的最小单元是线程,线程是轻量级进程. 线程优先级由setPriority(int)方法来设置,默认优先级是5,等级1~10.等级越高分的 ...
- Java编码规范之数据对象命名
数据对象分多种,为方便阅读并区分各数据对象的用途,习惯将数据对象分为以下几类,供参考: 持久对象 PO(persistant object)对象关系映射(ORM)概念的产物,基本上对象的成员变量对应了 ...
- Netty ByteBuf(图解之 2)| 秒懂
目录 Netty ByteBuf(图解二):API 图解 源码工程 写在前面 ByteBuf 的四个逻辑部分 ByteBuf 的三个指针 ByteBuf 的三组方法 ByteBuf 的引用计数 Byt ...
- Generally a good method to avoid this is to randomly shuffle the data prior to each epoch of training.
http://ufldl.stanford.edu/tutorial/supervised/OptimizationStochasticGradientDescent/
- Python中为什么要使用线程池?如何使用线程池?
系统处理任务时,需要为每个请求创建和销毁对象.当有大量并发任务需要处理时,再使用传统的多线程就会造成大量的资源创建销毁导致服务器效率的下降.这时候,线程池就派上用场了.线程池技术为线程创建.销毁的开销 ...
- Linux系统监控的几个命令
uptime 系统时间.运行时间.连接数(没一个终端算一个连接).在1,5,15分钟内系统负载 uname -a 查看系统所有相关信息 -r 查看系统内核版本 -s 查看系统内核名 ...
- Javaweb--- EL表达式 JSTL标准标签库
一.EL表达式(expression language): 语法 ${...} jsp中page指令有一个属性叫isELIgnored, 用来标记此页面是否忽略EL表达式, 默认为false 举个例 ...
- 【HTTP】HTPP学习笔记
1.了解web及网络基础 HTTP的诞生 TCP/IP协议族 应用层 FTP文件传输协议 HTTP超文本传输协议 DNS域名系统:IP地址<--->域名 传输层 TCP传输控制协议 三次握 ...
- vim中使用sed去除网上copy的源代码行号和空格
有些时候,在网上搜索到的代码都包含有行号,高亮显示控件不支持直接提取,如: test.sh 01 #!/bin/bash 02 echo “aaa” 简单的去掉行号和前面的空格: 方案一: 1.vim ...
- sql获取数组长度
需求:获取字符串数组1,2,3,4的长度,当然也可以是其他分隔符1|2|3等 方法:通过自定义函数来实现 /* 获取字符串数组长度 */ from sysobjects where id = obje ...