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等各个方面进行分析和设计,确保在线程安全的情况下再引入多线程。后期引入多线程的成本要比刚开始设计就包含多线程要高很多。

时间: 2024-12-22 13:29:54

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

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

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

从仿QQ消息提示框来谈弹出式对话框

<代码里的世界> -UI篇 用文字札记描绘自己 android学习之路 转载请保留出处 by Qiao http://blog.csdn.net/qiaoidea/article/details/45896477 [导航] - 自定义弹出式对话框的简单用法 列举各种常见的对话框实现方案 1.概述 android原生控件向来以丑著称(新推出的Material Design当另说),因此几乎所有的应用都会特殊定制自己的UI样式.而其中弹出式提示框的定制尤为常见,本篇我们将从模仿QQ退出提示框来看一

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

c#写的软件很多,如何添加诸如像搜狗输入法软件与灵格斯翻译软件的屏幕右下角弹出式广告呢. c#代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.

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

零.引言 PropertyGrid中我们经常看到一些下拉式的编辑方式(Color属性)和弹出式编辑框(字体),这些都是为一些复杂的属性提供的编辑方式,本文主要说明如何实现这样的编辑方式. 一.为属性提供编辑类 弹出式和下拉式是如何实现的呢,这需要为属性提供一个专门的编辑类..Net为我们提供了一个System.Drawing.Design.UITypeEditor类,它是所有编辑类的基类,从他继承出了诸如ColorEditor.FontEditor的类,因此我们可以在属性框中编辑颜色和字体.定义

IOS 弹出式 POPMenuView

//MenuView.h // //  MenuView.h //  RockPopMenu // //  Created by zhuang chaoxiao on 14-6-26. //  Copyright (c) 2014年 zhuang chaoxiao. All rights reserved. // #import <UIKit/UIKit.h> @protocol MenuViewDelegate @optional @end @interface MenuView : UIV

JavaScript弹出式日历控件 无jquery

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" cont

导航条——弹出式悬浮菜单

1.概述 采用弹出式悬浮菜单,不但可以使网站的导航内容更加清晰,而且不影响页面的整体效果.运行本实例,如图1所示,当鼠标移动到一级导航菜单的标题上时,将弹出悬浮菜单显示该菜单对应的子菜单,鼠标移出时,将隐藏悬浮菜单. 2.技术要点 本实例主要是在JavaScript中,动态改变<div>标签对象的style属性的display属性值来实现动态显示和隐藏二级导航菜单.其实,每一个一级菜单下的二级菜单内容是已经添加在网页的<div>标签中,只是此时设置了<div>不显示.所

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

其实一直没向用户提供到期弹出式页面,主要是给VIP群的用户一点优越感,随着这次EasyRadius的更新,海哥就免费向普通easyRadius用户提供这两个模板下载. 有些人会问,什么样的模板.有什么功能? 你先看看下面的图片,休息片刻,我再接下去为你简单说明下吧. 下载地址:登陆oa.ooofc.com,系统设置,用户中心设置,就可以看到了.要是看到见,请睁大眼睛噢. 账目号到期模板(用户到期,被限制上网的通告): 本页面使用红色和粉色搭配,让用户有较大的视角感受,同时同供二维码标识,您可以放

css制作的弹出式图片

<html> <head> <title>css制作的弹出式图片预览效果|梨花粉价格|石家庄水泵厂</title> <style type="text/css"> .thumbnail{ position: relative; z-index: 0; } .thumbnail:hover{ background-color: transparent; z-index: 50; } .thumbnail span{ /*CSS