本文主要内容

  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. asp.net 弹出式日历控件 选择日期 Calendar控件

    原文地址:asp.net 弹出式日历控件 选择日期 Calendar控件 作者:逸苡 html代码: <%@ Page Language="C#" CodeFile=&quo ...

  2. PropertyGrid—为复杂属性提供下拉式编辑框和弹出式编辑框

    零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提 ...

  3. web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)

    这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...

  4. web开发实战--弹出式富文本编辑器的实现思路和踩过的坑

    前言: 和弟弟合作, 一起整了个智慧屋的小web站点, 里面包含了很多经典的智力和推理题. 其实该站点从技术层面来分析的话, 也算一个信息发布站点. 因此在该网站的后台运营中, 富文本的编辑器显得尤为 ...

  5. ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法

    Ionic中[弹出式窗口]有两种(如下图所示),$ionicModal和$ionicPopup; $ionicModal是完整的页面: $ionicPopup是(Dialog)对话框样式的,直接用Ja ...

  6. php弹出式登录窗口并获得登录后返回值

    一款bootstrap样式结合php制作的弹出式登录窗口,输入用户名和密码后,ajax传参给后台,并获得登录后返回值. hwLayer+ajax弹出登录框 $(function() { $('#for ...

  7. 让小区运营再智能一点,EasyRadius正式向WayOs用户提供到期弹出式提示充值页面

    其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么 ...

  8. 【转】PyQt弹出式对话框的常用方法及标准按钮类型

    pyQt之弹出式对话框(QMessageBox)的常用方法及标准按钮类型 一.控件说明 QMessageBox是一种通用的弹出式对话框,用于显示消息,允许用户通过单击不同的标准按钮对消息进行反馈,且每 ...

  9. JS框架_(JQuery.js)Tooltip弹出式按钮插件

    百度云盘 传送门 密码:7eh5 弹出式按钮效果 <!DOCTYPE html> <html > <head> <meta charset="UTF ...

随机推荐

  1. 【BZOJ1444】[Jsoi2009]有趣的游戏 AC自动机+概率DP+矩阵乘法

    [BZOJ1444][Jsoi2009]有趣的游戏 Description Input 注意 是0<=P Output Sample Input Sample Output HINT  30%的 ...

  2. [note]树链剖分

    树链剖分https://www.luogu.org/problemnew/show/P3384 概念 树链剖分,是一种将树剖分成多条不相交的链的算法,并通过其他的数据结构来维护这些链上的信息. 最简单 ...

  3. java_Ninja实战过程

    使用Ninja马上两年了,之前多多少少的都是跟着项目模仿着写,今年上半年准备从一个小项目开始从始至终走一遍; 首先官网:http://www.ninjaframework.org; github: h ...

  4. 关于Unicode转为str的方法

    unicode_a=u'\u810f\u4e71' str_a=unicode_a.encode('unicode-escape').decode('string_escape')

  5. web开发工具网站

    配色 http://peise.net/tools/web/   http://retinaicon.com/   http://flattyshadow.com/     免费图片网站 https: ...

  6. Data Structure Binary Tree: Inorder Tree Traversal without Recursion

    http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion/ #include <iostream> #in ...

  7. Please enable network time synchronisation in system settings

    eth区块同步出现这样的WARN: WARN [06-17|13:02:42] System clock seems off by -51.509894715s, which can prevent ...

  8. 【leetcode刷题笔记】Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

  9. origin与referer的区别

    referer显示来源页面的完整地址,而origin显示来源页面的origin: protocal+host,不包含路径等信息,也就不会包含含有用户信息的敏感内容 referer存在于所有请求,而or ...

  10. parseInt、parseFloat、Number、Boolean、valueOf总结

    parseInt(string, radix) 功能: 将字符串转换为十进制的数字 radix: string的进制,没有时根据string进行判断: 1~9开头 十进制 0x开头 16进制 0开头 ...