16 12
发新话题
打印

在Ruby中使用线程

在Ruby中使用线程

线程(Thread)就是指能在一个程序中处理若干控制流的功能。与OS提供的进程不同的是,线程可以共享内存空间。

Ruby中使用的线程是用户级线程,由Ruby解释器进行切换管理。其效率要低于由OS管理线程的效率,且不能使用多个CPU,这确实是它的缺点。但其优点也很明显,即可移植性很高。

线程的生成
可以使用Thread.start方法来生成新线程。其用法如下。
复制内容到剪贴板
代码:
Thread.start { .... }
Thread.start生成新线程后,新线程会对迭代程序块进行判断。举个简单的例子来看一看线程如何运作。
复制内容到剪贴板
代码:
1  Thread.start {
2     while true
3        print "thread 1\n"
4     end
5  }
6
7  while true
8     print "thread 2\n"
9  end
程序运行后“thread1”和“thread2”交替出现,可以看出有两个无限循环在同时运作。请按下Ctrl-C来终止程序。

线程的操作
线程类的方法如下。

Thread.start {...}
Thread.new {...}
生成新线程,并对迭代程序块进行判断。返回新生成的线程对象。new是start的别名。
Thread.current
返回当前运行的线程对象。
Thread.exit
终止当前运行的线程对象。
Thread.join thread
挂起现在的线程,直到指定线程运行结束为止。
Thread.kill thread
终止指定线程的运行。
Thread.pass
将控制权显式地交给其他可运行的线程。
Thread.stop
挂起现在的线程,直到其他线程运行thread#run为止。
Thread#exit
终止receiver线程。
Thread#run
重新开启receiver线程。
Thread#stop
挂起receiver线程。
Thread#status
若receiver线程存在则返回真。若线程因错误而终止,则引发那个错误。
Thread#value
返回判断receiver迭代程序块的结果。若判断迭代程序块的过程尚未完成,则等到该线程终止为止。
线程间的同步
因为线程共享内存空间,所以使用普通的变量就可完成线程间的数据交换工作。但是为了使操作的时机得当,有必要进行同步。若同步失败会引起各种问题,如可能会一直等一个不可能出现的数据而陷入死锁状态,或接收了非预期数据导致难以查找的错误等等。

Ruby的线程库提供了两种同步方法。一种是只负责同步的Mutex,还有一种是兼管数据交接的Queue。若想使用这些库,需要在程序头部调用下列内容。
复制内容到剪贴板
代码:
require "thread"
Mutex
Mutex是mutual-exclusion lock(互斥锁)的简称。若对Mutex加锁时发现已经处于锁定状态时,线程会挂起直到解锁为止。

在并行访问中保护共享数据时,可以使用下列代码(m是Mutex的实例)。
复制内容到剪贴板
代码:
begin
   m.lock
   # 访问受m保护的共享数据
ensure
   m.unlock
end
Mutex有个synchronize方法可以简化这一过程。
复制内容到剪贴板
代码:
m.synchronize {
   # 访问受m保护的共享数据
}
举个简单的例子。
复制内容到剪贴板
代码:
1  require "thread"
2
3  m = Mutex.new
4  v = 0;                # 受m保护的数据
5
6  Thread.start {
7     while true
8        m.synchronize {
9          v = v + 100
10        }
11     end
12  }
13
14  while true
15     m.synchronize {
16        v = v - 33
17    }
18  end
若此程序中不使用Mutex加以保护的话,因为时机问题,在一个线程读取v的数值后还没来得及进行赋值的时候,另一个线程可能已经改变了v的数值。

Mutex有下列方法。

Mutex.new
生成新的互斥锁。
Mutex#lock
加锁。若已经处于加锁状态则会一直等待下去,直到解锁为止。
Mutex#unlock
解锁。若有其它等锁的线程则会让它们通过。
Mutex#synchronize
执行从获得锁到解锁全过程的迭代器。
Mutex#try_lock
获得锁。若已处于加锁状态,则返回false且不会挂起。
Queue
Queue就像一条读写数据的管道。提供数据的线程在一边写入数据,而读取数据的线程则在另一边读出数据。若Queue中没有可供读取的数据时,读取数据的线程会挂起等待数据的到来。

下面就是一个使用Queue的简单程序。
复制内容到剪贴板
代码:
1 require "thread"
2
3 q = Queue.new
4
5 th = Thread.start {
6    while line = q.pop
7       print line
8    end
9 }
10
11 while gets
12    q.push $_
13 end
14 q.push nil        # 终止标记
15 th.join
本程序中,一个线程读入一行之后,另一个线程就输出它。若把第3行改成数组,即“q = []”后,线程间失去同步,则程序无法正确运作。

Queue有下列方法。

Queue.new
生成新的Queue。
Queue.empty?
若Queue为空则返回真。
Queue.push value
向Queue添加value。
Queue.pop [non_block]
从Queue中取出数据。若参数non_block被指定为非假值而且Queue为空时,则引发错误。其他情况下,若Queue为空时,读取数据的线程会被挂起直到有新数据加入。
例题
让我们来看一看在并行处理编程领域中非常有名的“哲学家就餐”问题。

“哲学家就餐”问题就是指在下述情况下,哲学家如何取得同步的问题。

有N位哲学家围坐在圆桌旁。圆桌中间放着盛满意大利面条的大盘子。另有N把叉子分别放在每位哲学家身旁。哲学家继续思考问题,若觉得饿就会拿起两旁的叉子就餐。吃完后就将叉子放回去。这些哲学家都是绅士,即使很饿也会等到两旁都有叉子可用之后才会就餐。

运行程序后会依次显示当前的状态。各个字符所代表的意义如下。

o:
正在思考问题的哲学家
*:
正在工作的哲学家
-:
无人使用的叉子
|:
正被使用的叉子
哲学家思考的时间和就餐的时间由随机数决定。
复制内容到剪贴板
代码:
1 #
2 # The Dining Philosophers - thread example
3 #
4 require "thread"
5
6 N=7    # number of philosophers
7 $forks = []
8 for i in 0..N-1
9   $forks[i] = Mutex.new
10 end
11 $state = "-o"*N
12
13 def wait
14   sleep rand(20)/10.0
15 end
16
17 def think(n)
18   wait();
19 end
20
21 def eat(n)
22   wait();
23 end
24
25 def philosopher(n)
26   while true
27     think n
28     $forks[n].lock
29     if not $forks[(n+1)%N].try_lock
30       $forks[n].unlock    # avoid deadlock
31       next
32     end
33     $state[n*2] = ?|;
34     $state[(n+1)%N*2] = ?|;
35     $state[n*2+1] = ?*;
36     print $state, "\n"
37     eat(n)
38     $state[n*2] = ?-;
39     $state[(n+1)%N*2] = ?-;
40     $state[n*2+1] = ?o;
41     print $state, "\n"
42     $forks[n].unlock
43     $forks[(n+1)%N].unlock
44   end
45 end
46
47 for i in 0..N-1
48   Thread.start{philosopher(i)}
49   sleep 0.1
50 end
51 sleep
52 exit

TOP

EVE ISK ,DOF, 2M ,FF ,WOW !

EVE ISK it's like a nice girl want have a love from
dofus kamas but anyone know
world of warcraft gold his power can make
Final Fantasy XI Gil and
2moons dil
over so no body want there !

TOP

dofus 3

so do  you sell dofus kamas,if you have cheap dofus kamas , please connect me as soon as possible!
hihi^^
i want to buy more and more , more and more!
so please take your time !
do you have dofus money, dofus gold ? i want them , i love them !
i have change a new envionment , it's new ,so it's interesting and changllege to me!
in a world ,i love dofus kamas , cheap dofus kamas !

TOP

中国性病治疗中心

TOP

发表一下看法

看帖子的都发表一下看法

-------------------------
Supply Cheap wow gold to our loyal customers. Buy wow gold now, we have available stock of wow goldon most of the servers. We can provide really cheap wow gold. Enjoy a new wow gold life, We are a world class wow gold store online !
学习才进步

TOP

★期货/股票开户免费,手续费最低QQ:10889023★★

★★期货开户免费/股票开户免费,手续费最低QQ:10889023,TEL15838025938★★

■销售业界最牛网络营销软件(全功能版本免费试用)。最小的投资最大的收益,超强的广告效果,超低的价格 QQ:10889023■
●本条系本软件发布●
★期货/股票开户免费QQ:10889023手续费最低★

TOP

dofus 3

so do  you sell dofus kamas,if you have cheap dofus kamas , please connect me as soon as possible!
hihi^^
i want to buy more and more , more and more!
so please take your time !
do you have dofus money, dofus gold ? i want them , i love them !
i have change a new envionment , it's new ,so it's interesting and changllege to me!
in a world ,i love dofus kamas , cheap dofus kamas !

TOP

丽妍堂真轻松排汗

正品丽妍堂真轻松排汗运动机厂家直销13738963879原厂正品--丽妍堂真轻松排汗运动机,蒸美康排汗运动机厂家直销,优惠直销.订购热线0579-87368390,运动排汗,强身健体,采用薰蒸的原理,集排毒,减压,健体,美容养颜,减肥,黄金睡眠功效为一体.每天蒸一蒸,跟疲劳,斑点,毒素说再见. 丽妍堂排汗,丽妍堂排汗机好不好,丽妍堂排汗机怎么样,丽妍堂排汗机好吗,丽妍堂真轻松排汗机 丽妍堂排汗运动机,丽妍堂排汗机的价格,丽妍堂真舒服排汗机,丽妍堂排汗机好不好,丽妍堂排汗机怎么样,丽妍堂排汗机好吗,丽妍堂排汗机价格,丽妍堂蒸汽排汗机。公司网站:www.hd273.com

TOP

TOP

加密狗破解USB加密锁并口串口狗QQ1167388

加密狗破解USB加密锁并口串口狗QQ1167388加密狗破解USB加密锁并口串口狗QQ1167388加密狗破解USB加密锁并口串口狗QQ1167388
详情请见:
http://www.nbbn.net/vip/lbin
软件加密狗破解技术和方法下载,复制加密狗锁电话15988877770联系QQ1167388

TOP

出售手机Q听器 手机Q听器 等器材010-51667274

出售手机Q 听器 手机Q 听器 等器材,电话:010-51667274

手机Q 听器简介俗话说:知己知彼,百战百胜。http://www.adm8n.cn
可以让您透彻了解同行之间的竞争对手。http://www.adm8n.cn
可以让您进一步了解公司员工及业务员的动态。http://www.adm8n.cn
可以让您更了解您的知心爱人、情人的一切行踪 。http://www.adm8n.cn
可以让您随时掌握您的孩子在校学习、生活的一切动态 。http://www.adm8n.cn

特别说明:
1、以上产品携带方便、可以作为手机使用,跟平常手机不同点:“是在原有的功能上添设了Q听芯片,网络连接端口,扩大了系统功能,
全国各地可以不限距离搜索”在手机有信号的地方都可以进行Q 听.
在对方没通话的时候也可以听到对方周围的声音.Q 听和定位不会产生话费

2、适用于私人侦探、丈夫包二奶调查取证、商业机密调查、业余娱乐。

出售手机Q听器 手机Q听器 等器材手机Q听器简介俗话说:知己知彼,百战百胜。可以让您透彻了解同行之间的竞争对手。可以让您进一步了解公司员工及业务员的动态。可以让您更了解您的知心爱人、情人的一切行踪 。可以让您随时掌握您的孩子在校学习、生活的一切动态 。特别说明: 1、以上产品携带方便、可以作为手机使用,跟平常手机不同点:     “是在原有的功能上添设了Q听芯片,网络连接端口,扩大了系统功能,    全国各地可以不限距离搜索”在手机有信号的地方都可以进行Q听.    在对方没通话的时候也可以听到对方周围的声音.Q听和定位不会产生话费。 2、适用于私人侦探、丈夫包二奶调查取证、商业机密调查、业余娱乐,促销电话:010-51667274

TOP

常人眼中正常

世纪初期最具潜力科龙空调维修部奇女子的柳清荷却似是而非,若有若无意地轻轻嘟囔了一句话,却使得被飘进耳朵的华云澳柯玛空调维修天如遭雷劈

TOP

不错啊,强烈支持!

不错啊,强烈支持!:
以后俺常来!!


google左侧排名专业提供google左侧排名等相关google左侧排名的服务!
google左侧排名专业提供google左侧排名等相关google左侧排名的服务!
google左侧排名的销售google左侧排名,有很多便宜的google左侧排名啊!
google优化的销售wow gold,有很多便宜的wow gold啊!
google排名的销售wow gold,有很多便宜的wow gold啊!
我的家:wow power leveling

TOP

支持楼主,我顶

我保持沉默,我只是路过,天下事,无奇不有,在我的网站里有专门这样的介绍请点击:上海搬场|上海搬家上海公兴搬场公司|上海公兴搬家公司浦东搬家|浦东搬场上海公兴搬家|上海公兴搬场
我的介绍请参阅我的站点

TOP

实在是没办法的事,大家加油了

哎2008了,大家加油了,很多无奈的事没办法啊,支持下自己吧,没事的时候看看VAGAA就好了,哎没意思。

TOP

 16 12
发新话题