Ruby多线程编程初步入门

2019-09-25 09:42:23王旭

这将产生以下结果:

count1 : 696591
count2 : 696591
difference : 0

处理死锁:

当我们开始使用互斥对象的线程排除,我们必须小心地避免死锁。死锁的情况发生时,所有线程正在等待获取另一个线程持有的资源。因为所有的线程被阻塞,他们不能释放其所持有的锁。因为他们可以不释放锁,其它线程不能获得这些锁。

一个条件变量仅仅是一个信号,与资源相关联,并用于特定互斥锁的保护范围内的。当需要一个资源不可用,等待一个条件变量。这一行动释放相应的互斥锁。当一些其他线程发送信号的资源是可用的,原来的线程来等待,并同时恢复上的锁临界区。
例子:

#!/usr/bin/ruby
require 'thread'
mutex = Mutex.new

cv = ConditionVariable.new
a = Thread.new {
  mutex.synchronize {
   puts "A: I have critical section, but will wait for cv"
   cv.wait(mutex)
   puts "A: I have critical section again! I rule!"
  }
}

puts "(Later, back at the ranch...)"

b = Thread.new {
  mutex.synchronize {
   puts "B: Now I am critical, but am done with cv"
   cv.signal
   puts "B: I am still critical, finishing up"
  }
}
a.join
b.join

这将产生以下结果:

A: I have critical section, but will wait for cv
(Later, back at the ranch...)
B: Now I am critical, but am done with cv
B: I am still critical, finishing up
A: I have critical section again! I rule!

线程状态:

有五种可能的返回值对应于下表中所示的5个可能的状态。该的状态方法返回的线程状态。

2015513111419712.jpg (585×209)
 Thread类的方法:

Thread类提供以下方法,它们适用程序的所有线程。这些方法它们使用Thread类的名称来调用,如下所示:

Thread.abort_on_exception = true

这里是所有类方法的完整列表:

2015513111447500.jpg (553×637)

2015513111506005.jpg (552×419)

 线程实例方法:

这些方法是适用于一个线程的一个实例。这些方法将被调用,使用一个线程的一个实例如下:

#!/usr/bin/ruby

thr = Thread.new do  # Calling a class method new
  puts "In second thread"
  raise "Raise exception"
end
thr.join  # Calling an instance method join

这里是所有实例方法的完整列表:

2015513111530766.jpg (552×724)

2015513111548091.jpg (547×503)