设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5671|回复: 13
打印 上一主题 下一主题

[原创发布] ruby线程问题——同步篇

 关闭 [复制链接]

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

跳转到指定楼层
1
发表于 2007-6-5 09:02:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
=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

如果有什么问题 欢迎补充。
神隐中,偶尔诈尸

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

2
 楼主| 发表于 2007-6-5 09:02:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
=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

如果有什么问题 欢迎补充。
神隐中,偶尔诈尸

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
3
发表于 2007-6-5 09:32:04 | 只看该作者
{/fd}Isn't the Mutex class built in the thread.rb?
http://www.ruby-doc.org/stdlib/libdoc/thread/rdoc/index.html
回复 支持 反对

使用道具 举报

Lv1.梦旅人

NewS-

梦石
0
星屑
50
在线时间
5 小时
注册时间
2005-10-23
帖子
3651

贵宾

4
发表于 2007-6-5 09:45:45 | 只看该作者
你们两位哟!

我进来参和参和。不能让你们两个在凌晨时分眉来眼去....{/gg}
66RPG,这几个简单字符,之于我代表了什么?泪泪博客:http://hi.baidu.com/rpgmakerxp
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
260
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

5
发表于 2007-6-5 15:28:29 | 只看该作者
感觉这个在游戏制作中不会用到.........{/hx}

只在操作系统还是什么课里学过线程.....{/hx}
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

6
 楼主| 发表于 2007-6-5 17:31:18 | 只看该作者
以下引用亿万星辰于2007-6-5 7:28:29的发言:

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

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


操作系统。。。。昨天在学的人路过。。。。
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

Lv1.梦旅人

獨·思

梦石
0
星屑
60
在线时间
2 小时
注册时间
2006-12-27
帖子
2085
7
发表于 2007-6-5 21:15:07 | 只看该作者
发现小夏?MS很久没有出现的说……………………抓住!
殘花逝盡心亦亂,劍魂難掩月色寒,
吟笛蕭瑟空留戀,雪落無痕為影殘。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
50 小时
注册时间
2006-11-16
帖子
3409
8
发表于 2007-6-5 21:34:43 | 只看该作者
以下引用亿万星辰于2007-6-5 7:28:29的发言:

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

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

操作系统,也就是P操作和V操作:
当时我还用flash给老师做了个演示动画,所以记忆很深刻……
最近好多想到PM的问题……不会嫌我烦了吧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-12-20
帖子
213
9
发表于 2007-6-5 23:25:26 | 只看该作者
以下引用叶子于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还素可以用的说= =
哼哼。。。。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
260
在线时间
1373 小时
注册时间
2005-10-16
帖子
5113

贵宾

10
发表于 2007-6-6 01:05:25 | 只看该作者
以下引用尤莉斯于2007-6-5 15:25:26的发言:
在处理一些网络连接什么什么的之类的 很多地方ms还素可以用的说= =

完全不打算涉足RM网络游戏制作的某人飘过.......{/hx}
我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-29 19:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表