赞 | 6 |
VIP | 356 |
好人卡 | 3 |
积分 | 2 |
经验 | 297560 |
最后登录 | 2022-1-18 |
在线时间 | 509 小时 |
Lv1.梦旅人 有事烧纸
- 梦石
- 0
- 星屑
- 154
- 在线时间
- 509 小时
- 注册时间
- 2005-10-22
- 帖子
- 6982
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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
如果有什么问题 欢迎补充。 |
|