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_threads0 sleep(0.001) p "Thread01 get the #{6 - apples}th apple." apples -= 1 if apples == 0 break end end endendt2 = 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 endend复制代码
可以看到线程01得到了第六个苹果- -bb,显然出错了。
2、同步的情况:
apples = 5mu_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 endendt2 = 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 endend复制代码此时就正常了。。= =bbb
如果有什么问题 欢迎补充。
本帖来自P1论坛作者雷欧纳德,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=55688若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]