文明之精神,野蛮之体魄。
全部博文(64)
分类: Python/Ruby
2013-05-09 10:27:27
一、 线程概述
1. 线程和进程:进程是具有一定独立功能,并且处于运行过程中的程序,是系统进行资源分配和调度的一个独立单位。一般而言,进程包含如下三个特征:1、独立性。2、动态性。3、并发性。(注:和并行性的区别)。。。。线程是进程的执行单元。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不再拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源。线程的调度和管理由进程本身负责完成。
2. 多线程的优势:1、进程间不能共享内存,但线程之间共享内存非常容易。2、Ruby线程是用户级别的线程,因此可以在任何操作系统上运行,而且具有完全相同的运行过程。3、Ruby线程不会引起系统抖动。Ruby的多线程是用户级别的,因此无法利用多处理器的优势。
二、 创建多线程
1. 用Thread类创建线程:创建一个Thread类的实例时,必须传入一个代码块作为 参数,这个代码块就是线程执行体。。。Thread类里包含两个方法:start和fork。基本上,使用start和fork方法来创建线程,和使用new方法来创建线程基本相似。但使用start和fork方法来创建线程时必须注意,如果我们定义了一个Thread类的子类,而且为该子类重新定义了initialize方法,这个方法不会被调用。
2. Ruby线程运行方式:当主线程结束时,Ruby中的其他线程也会结束。(和java不同)。。。Ruby的线程调度采用的是带优先顺序的循环调度法。
三、 控制线程
当线程被创建以后,主要由线程调度器来调度它,通常程序员无法干预线程的运行。
1. join线程:如果线程A在某个点必须等线程B执行结束后才可继续执行,我们可以在线程A的该点调用线程B的join方法,那么A必须等线程B执行结束后才可在该点继续前进。。。。。如果我们不想其他线程随主线程而结束,则可以在主线程中调用其他线程的join方法,则主线程会在这个点等待,知道该线程执行完毕。
2. 控制线程的方法:Thread的current、list、status、alive?、priority、priority=、main、pass、kill和exit。。。注意:被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实现同步。