线程

一、启动一个新线程

Thread.new {
    #线程执行代码
 }

 

def func1
    i = 0
    while i<=2
        puts "func1 at : #{Time.now}"
        sleep(2)
        i=i+1
    end
end
def func2
    j = 0
    while j<=2
        puts "func2 at : #{Time.now}"
        sleep(1)
        j=j+1
    end
end

puts "start at #{Time.now}"
t1 = Thread.new{func1()}
t2 = Thread.new{func2()}
t1.join            #执行线程
t2.join
puts "end at #{Time.now}

 

二、线程同步

 1. 通过Mutex类实现线程同步
 2. 监管数据交接的Queue类实现线程同步
 3. 使用ConditionVariable实现同步控制

#使用mutex类
require "thread"

@num = 200
@mutex = Mutex.new

def buyTicket(num)
    @mutex.lock
        if @num>=num
            puts "you have bought #{num} tickets"
            @num = @num - num
        else
            puts "tickets are not enough"
        end
    @mutex.unlock
end

ticket1 = Thread.new 10 do
    10.times do |value|
        ticketNum = 15
        buyTicket(ticketNum)
        sleep(0.01)
    end
end
ticket2 = Thread.new 10 do
    10.times do |value|
        ticketNum = 10
        buyTicket(ticketNum)
        sleep(0.01)
    end
end

ticket1.join
ticket2.join

 

#使用Queue类
require "thread"
queue = Queue.new
producer = Thread.new do 
    10.times do |i|
        sleep rand(i)
        queue << i
        puts "#{i} produced"
    end
end

consumer = Thread.new do
    10.times do |j|
        value = queue.pop
        sleep rand(j/2)
        puts "#{value} consumed"
    end
end

consumer.join

 

三、进程互斥

require 'thread'
mutex = Mutex.new

count1 = count2 = 0
difference = 0
counter = Thread.new do
   loop do
      mutex.synchronize do        #synchronize 
         count1 += 1
         count2 += 1
      end
    end
end
spy = Thread.new do
   loop do
       mutex.synchronize do
          difference += (count1 - count2).abs
       end
   end
end
sleep 1
mutex.lock
puts "count1 :  #{count1}"
puts "count2 :  #{count2}"
puts "difference : #{difference}"

 

四、死锁

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

 

posted @ 2016-09-06 13:06  Hsinwang  阅读(121)  评论(0编辑  收藏  举报