Project1

标题: ruby线程问题——同步篇 [打印本页]

作者: 雷欧纳德    时间: 2007-6-5 09:02
标题: ruby线程问题——同步篇
=begin
    脚本:【线程同步类】
    功能:对使用ruby多线程编程时,对临界资源进行同步操作的类。
    说明: 对于不同线程访问临界资源(公共变量等)时,应进行同步。
          步骤:
          1、创建Mutex对象;
          2、在线程内要访问临界资源的地方调用Mutex(互斥)对象的同步方法进行同步。
          e.g.: lock = Mutex.new
                 lock.synchronize{
                   # 中间即要同步的块
                 }
    作者:灼眼的夏娜
    版本:v1.0。
=end

  1. #==============================================================================
  2. # ■ Mutex
  3. #------------------------------------------------------------------------------
  4. #  互斥锁的类。
  5. #==============================================================================
  6. class Mutex
  7.   
  8.     #--------------------------------------------------------------------------
  9.     # ● 初始化
  10.     #--------------------------------------------------------------------------
  11.     def initialize
  12.       @synchronizing = false
  13.       @waiting_threads = Array.new
  14.     end
  15.   
  16.     #--------------------------------------------------------------------------
  17.     # ● 同步块
  18.     #--------------------------------------------------------------------------
  19.     def synchronize
  20.       Thread.critical = true
  21.       if @synchronizing
  22.         @waiting_threads << Thread.current
  23.         Thread.stop
  24.       end
  25.       @synchronizing = true
  26.       Thread.critical = false
  27.       yield
  28.       Thread.critical = true
  29.       next_thread = @waiting_threads.shift
  30.       if next_thread.nil?
  31.         @synchronizing = false
  32.       else
  33.         next_thread.run
  34.       end
  35.       Thread.critical = false
  36.     end
  37.   
  38. end
复制代码


以下举例:

1、未同步的情况:
  1. apples = 5

  2. t1 = Thread.new do
  3.     while true
  4.       if apples > 0
  5.         sleep(0.001)
  6.         p "Thread01 get the #{6 - apples}th apple."
  7.         apples -= 1
  8.         if apples == 0
  9.           break
  10.         end
  11.       end
  12.     end
  13. end

  14. t2 = Thread.new do
  15.     while true
  16.       if apples > 0
  17.         sleep(0.001)
  18.         p "Thread02 get the #{6 - apples}th apple."
  19.         apples -= 1
  20.         if apples == 0
  21.           break
  22.         end
  23.       end
  24.     end
  25. end
复制代码

可以看到线程01得到了第六个苹果- -bb,显然出错了。

2、同步的情况:
  1. apples = 5

  2. mu_obj = Mutex.new # 创建互斥对象

  3. t1 = Thread.new do
  4.     while true
  5.     mu_obj.synchronize do # 同步块
  6.         if apples > 0
  7.           sleep(0.001)
  8.           p "Thread01 get the #{6 - apples}th apple."
  9.           apples -= 1
  10.           if apples == 0
  11.             break
  12.           end
  13.         end
  14.     end
  15.     end
  16. end

  17. t2 = Thread.new do
  18.     while true
  19.     mu_obj.synchronize do # 同步块
  20.         if apples > 0
  21.           sleep(0.001)
  22.           p "Thread02 get the #{6 - apples}th apple."
  23.           apples -= 1
  24.           if apples == 0
  25.             break
  26.           end
  27.         end
  28.     end
  29.     end
  30. end
复制代码
此时就正常了。。= =bbb

如果有什么问题 欢迎补充。
作者: 雷欧纳德    时间: 2007-6-5 09:02
标题: ruby线程问题——同步篇
=begin

    脚本:【线程同步类】
  
    功能:对使用ruby多线程编程时,对临界资源进行同步操作的类。
  
    说明: 对于不同线程访问临界资源(公共变量等)时,应进行同步。
  
          步骤:
          1、创建Mutex对象;
          2、在线程内要访问临界资源的地方调用Mutex(互斥)对象的同步方法进行同步。
        
          e.g.: lock = Mutex.new
        
                 lock.synchronize{
                   # 中间即要同步的块
                 }

    作者:灼眼的夏娜
  
    版本:v1.0。

=end

#==============================================================================
# ■ Mutex
#------------------------------------------------------------------------------
#  互斥锁的类。
#==============================================================================
class Mutex
  
    #--------------------------------------------------------------------------
    # ● 初始化
    #--------------------------------------------------------------------------
    def initialize
      @synchronizing = false
      @waiting_threads = Array.new
    end
  
    #--------------------------------------------------------------------------
    # ● 同步块
    #--------------------------------------------------------------------------
    def synchronize
      Thread.critical = true
      if @synchronizing
        @waiting_threads << Thread.current
        Thread.stop
      end
      @synchronizing = true
      Thread.critical = false
      yield
      Thread.critical = true
      next_thread = @waiting_threads.shift
      if next_thread.nil?
        @synchronizing = false
      else
        next_thread.run
      end
      Thread.critical = false
    end
  
end

以下举例:

1、未同步的情况:

apples = 5

t1 = Thread.new do
    while true
      if apples > 0
        sleep(0.001)
        p "Thread01 get the #{6 - apples}th apple."
        apples -= 1
        if apples == 0
          break
        end
      end
    end
end

t2 = Thread.new do
    while true
      if apples > 0
        sleep(0.001)
        p "Thread02 get the #{6 - apples}th apple."
        apples -= 1
        if apples == 0
          break
        end
      end
    end
end

可以看到线程01得到了第六个苹果- -bb,显然出错了。

2、同步的情况:

apples = 5

mu_obj = Mutex.new # 创建互斥对象

t1 = Thread.new do
    while true
    mu_obj.synchronize do # 同步块
        if apples > 0
          sleep(0.001)
          p "Thread01 get the #{6 - apples}th apple."
          apples -= 1
          if apples == 0
            break
          end
        end
    end
    end
end

t2 = Thread.new do
    while true
    mu_obj.synchronize do # 同步块
        if apples > 0
          sleep(0.001)
          p "Thread02 get the #{6 - apples}th apple."
          apples -= 1
          if apples == 0
            break
          end
        end
    end
    end
end

此时就正常了。。= =bbb

如果有什么问题 欢迎补充。

作者: 叶子    时间: 2007-6-5 09:32
{/fd}Isn't the Mutex class built in the thread.rb?
http://www.ruby-doc.org/stdlib/libdoc/thread/rdoc/index.html
作者: 九泪    时间: 2007-6-5 09:45
你们两位哟!

我进来参和参和。不能让你们两个在凌晨时分眉来眼去....{/gg}
作者: 亿万星辰    时间: 2007-6-5 15:28
感觉这个在游戏制作中不会用到.........{/hx}

只在操作系统还是什么课里学过线程.....{/hx}
作者: 雷欧纳德    时间: 2007-6-5 17:31
以下引用亿万星辰于2007-6-5 7:28:29的发言:

感觉这个在游戏制作中不会用到.........

只在操作系统还是什么课里学过线程.....


操作系统。。。。昨天在学的人路过。。。。
作者: ю殘劒唫轌Θ    时间: 2007-6-5 21:15
发现小夏?MS很久没有出现的说……………………抓住!
作者: 金圭子    时间: 2007-6-5 21:34
以下引用亿万星辰于2007-6-5 7:28:29的发言:

感觉这个在游戏制作中不会用到.........

只在操作系统还是什么课里学过线程.....

操作系统,也就是P操作和V操作:
当时我还用flash给老师做了个演示动画,所以记忆很深刻……
作者: 尤莉斯    时间: 2007-6-5 23:25
以下引用叶子于2007-6-5 1:32:04的发言:

Isn't the Mutex class built in the thread.rb?
http://www.ruby-doc.org/stdlib/libdoc/thread/rdoc/index.html

{/gg}
以下引用亿万星辰于2007-6-5 7:28:29的发言:

感觉这个在游戏制作中不会用到.........

只在操作系统还是什么课里学过线程.....

{/cy}在处理一些网络连接什么什么的之类的 很多地方ms还素可以用的说= =
作者: 亿万星辰    时间: 2007-6-6 01:05
以下引用尤莉斯于2007-6-5 15:25:26的发言:
在处理一些网络连接什么什么的之类的 很多地方ms还素可以用的说= =

完全不打算涉足RM网络游戏制作的某人飘过.......{/hx}
作者: gpra8764    时间: 2007-6-6 21:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: 七夕小雨    时间: 2007-6-6 21:35
难道RM快要可以后台运行了么~{/gg}
作者: 红世之徒    时间: 2007-6-6 22:12
这个是否可以解决RMTV中显示图片与Bgm同步的问题?
作者: 叶舞枫    时间: 2007-6-16 02:34
http://rpg.blue/web/htm/news751.htm
vip 1




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1