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

Project1

 找回密码
 注册会员
搜索
查看: 5698|回复: 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.梦旅人

Dancer-

梦石
0
星屑
55
在线时间
76 小时
注册时间
2006-11-9
帖子
3551

开拓者贵宾

14
发表于 2007-6-16 02:34:44 | 只看该作者
http://rpg.blue/web/htm/news751.htm
vip 1
回复 支持 反对

使用道具 举报

Lv1.梦旅人

翔于天壤之人<

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-10-10
帖子
708
13
发表于 2007-6-6 22:12:32 | 只看该作者
这个是否可以解决RMTV中显示图片与Bgm同步的问题?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

昨日的黄昏

梦石
0
星屑
106
在线时间
936 小时
注册时间
2006-11-5
帖子
4128

第2届短篇游戏比赛季军第3届短篇游戏大赛小游戏及其他组季军

12
发表于 2007-6-6 21:35:29 | 只看该作者
难道RM快要可以后台运行了么~{/gg}
[url=http://weibo.com/2238291690?s=6uyXnP]
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
11
发表于 2007-6-6 21:23:40 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

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

贵宾

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

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

使用道具 举报

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还素可以用的说= =
哼哼。。。。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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的发言:

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

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


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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-15 11:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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