Chinaunix首页 | 论坛 | 博客
  • 博客访问: 321398
  • 博文数量: 64
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1972
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 21:53
个人简介

文明之精神,野蛮之体魄。

文章分类
文章存档

2015年(4)

2013年(60)

我的朋友

分类: Python/Ruby

2013-05-09 10:27:27

一、      线程概述

1.    线程和进程:进程是具有一定独立功能,并且处于运行过程中的程序,是系统进行资源分配和调度的一个独立单位。一般而言,进程包含如下三个特征:1、独立性。2、动态性。3、并发性。(注:和并行性的区别)。。。。线程是进程的执行单元。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不再拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源。线程的调度和管理由进程本身负责完成。

2.    多线程的优势:1、进程间不能共享内存,但线程之间共享内存非常容易。2Ruby线程是用户级别的线程,因此可以在任何操作系统上运行,而且具有完全相同的运行过程。3Ruby线程不会引起系统抖动。Ruby的多线程是用户级别的,因此无法利用多处理器的优势。

二、      创建多线程

1.    Thread类创建线程:创建一个Thread类的实例时,必须传入一个代码块作为 参数,这个代码块就是线程执行体。。。Thread类里包含两个方法:startfork。基本上,使用startfork方法来创建线程,和使用new方法来创建线程基本相似。但使用startfork方法来创建线程时必须注意,如果我们定义了一个Thread类的子类,而且为该子类重新定义了initialize方法,这个方法不会被调用。

2.    Ruby线程运行方式:当主线程结束时,Ruby中的其他线程也会结束。(和java不同)。。。Ruby的线程调度采用的是带优先顺序的循环调度法。

三、      控制线程

当线程被创建以后,主要由线程调度器来调度它,通常程序员无法干预线程的运行。

1.    join线程:如果线程A在某个点必须等线程B执行结束后才可继续执行,我们可以在线程A的该点调用线程Bjoin方法,那么A必须等线程B执行结束后才可在该点继续前进。。。。。如果我们不想其他线程随主线程而结束,则可以在主线程中调用其他线程的join方法,则主线程会在这个点等待,知道该线程执行完毕。

2.    控制线程的方法:Threadcurrentliststatusalive?、prioritypriority=mainpasskillexit。。。注意:被kill线程处于aborting状态,但被exit的线程处于false状态。

3.    线程状态:

sleep:当一个线程主动调用sleep方法或stop方法,都会让该线程处于sleep状态,或者该线程正在等待I/O

run:运行状态。

aborting:线程被取消后的状态。

false:线程正常终止后的状态。

nil:线程被非正常中止后。

四、      深入线程

1.    线程和变量:同一个线程可以共享该进程的内存空间,并可以自由访问该进程内的所有局部变量。如果我们想让一个线程的局部变量能被其他线程访问,则按名字创建和访问线程 内的局部变量。当我们根据名字来创建和访问线程的局部变量时,我们可以把线程看成一个Hash对象,使用[]=方法设置线程局部变量的值,使用[]方法来取得指定局部变量的值。。。。。当我们把某条线程里的局部变量放到这个线程的“仿hash对象”中以后,即使该线程运行结束,不管是调用kill方法还是exit方法,这个线程的“仿hash对象”里放置的局部变量依然可以访问。。。。。。。。。Ruby还提供了两个方法来操作线程的“仿Hash对象”里的值。。。。。

key?(sym):判断变量sym是否存在。

keys():返回一个数组,用于返回线程的“仿hash对象”里的所有的变量名。

2.    线程和异常:我们可以通过Thread的类属性abort_on_exception来设置该状态。系统默认为false。即当一条线程遇到未处理的异常时,该线程被中止,但系统的其他线程不受任何影响,将一直运行结束。如果程序将系统的abort_on_exception状态设置成true,这意味着当一条线程遇到未处理的异常时,将导致整个程序完全中止,而不仅仅是本线程。

五、      多线程的同步

1.    线程安全问题:因为线程切换的不确定性,我们无法保证线程不在那里切换。

2.    使用Mutex实现互斥:Ruby语言中的同步锁只能由Mutex实例充当。Mutex定义了一个实例方法synchronize,该方法接受一个代码块作为参数,它负责把这个代码块设置成同步代码。

3.    使用Condition Variable实现同步。

阅读(1624) | 评论(0) | 转发(0) |
0

上一篇:异常处理

下一篇:I/O

给主人留下些什么吧!~~