Ruby线程(二)

      熟悉线程的朋友应该对经典的售票员卖票程序不陌生。全国各地有很多售票点同时发售车票,车票在这里作为一个公用的资源,各地的售票中心访问资源,打印车票给顾客。我们来看一下ruby实现这个简单功能的代码吧:

# 线程-买票实例
class Ticket
  attr_reader :ticket
  attr_reader :value
  def initialize
    @ticket = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
    @value = 0
  end

  def buy_ticket
    @k = @ticket
    if @k.empty?
      puts "no result"
      @value +=1
    else
      sleep(3*rand)
      puts "the ticket is #{@k.last} "
      sleep(3*rand)
      @value +=1
      puts "OK #{@value}"
      @ticket.pop
      puts "**************分隔符******************"
    end
  end
end


a = Ticket.new
t1 = Thread.new { 10.times {puts "线程1" ; a.buy_ticket  } }
t2 = Thread.new { 10.times { puts "线程2"; a.buy_ticket  } }
t3 = Thread.new { 10.times { puts "线程3"; a.buy_ticket  } }
t1.join
t2.join
t3.join

      我们开了3个线程分别表示不同的3个售票点同事发售车票,我们在发售车票的时候使用了sleep来模拟工作人员操作的时间。

 @ticket = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)

      @ticket这个数组用来表示一组车票。好我们来运行这个程序,看能看到什么结果

线程1线程2线程3





the ticket is z 

OK 1

**************分隔符******************

线程3

the ticket is y 

the ticket is y 

the ticket is y 

OK 2

**************分隔符******************

线程2

OK 3

**************分隔符******************

线程1

OK 4

**************分隔符******************

线程3

the ticket is v 

the ticket is v 

the ticket is v 

OK 5

      我们可以看见,有的车票被多个窗口同时卖出,当然这在规定当中是不允许的。这个是为什么呢?我们来看一下程序。乍一看是肯定没有什么问题的。细细想想,假设我们的线程1进入卖票程序,并查看到当前可以买y票。线程1睡眠一段时间,假设这段时间正好线程2进来了,并执行了卖票程序,此时线程1并未实际意义上的把票卖了出去,这就导致了两个线程卖出了同一张票。

       那么有没有解决办法呢?比如说,在线程1进入程序的时候,就把票给锁死了,这样线程2来的时候就不能对该张票进行操作。在ruby当中有个监视器monitor可是实现该功能。我们对买票这个操作进行监视控制,只能同时一个人来操作。好吧,我们来看一下下面的代码:

# 线程-买票实例
require 'monitor'
class Ticket
  attr_reader :ticket
  attr_reader :value
  def initialize
    @ticket = %w(a b c d e f g h i j k l m n o p q r s t u v w x y z)
    @value = 0
  end

  def buy_ticket
    @k = @ticket
    if @k.empty?
      puts "no result"
      @value +=1
    else
      sleep(3*rand)
      puts "the ticket is #{@k.last} "
      sleep(3*rand)
      @value +=1
      puts "OK #{@value}"
      @ticket.pop
      puts "**************分隔符******************"
    end
  end
end


a = Ticket.new
k = Monitor.new
t1 = Thread.new { 10.times {k.synchronize{puts "线程1" ; a.buy_ticket  }} }
t2 = Thread.new { 10.times {k.synchronize{puts "线程2" ; a.buy_ticket  }} }
t3 = Thread.new { 10.times {k.synchronize{puts "线程3" ; a.buy_ticket  }} }
t1.join
t2.join
t3.join

puts a.value

      我们使用了监视器来对资源进行监视,不能同时由多个线程进行操作,避免重复卖票的情况,这中间的核心部分就是如下所示:

 

k = Monitor.new
t1 = Thread.new { 10.times {k.synchronize{puts "线程1" ; a.buy_ticket  }} }
t2 = Thread.new { 10.times {k.synchronize{puts "线程2" ; a.buy_ticket  }} }
t3 = Thread.new { 10.times {k.synchronize{puts "线程3" ; a.buy_ticket  }} }

     当然,我们可以不对该操作进行监视,我们对票据资源进行监视。也会使用到synchronize。这里就不再赘述,想知道的可以参考programming ruby。

     好拉。今天就写这么多吧。o(∩_∩)o...哈哈

ns3-gym入门(二):linear-mesh例子详解 学习ns3-gym中关于IEEE 802.11网状网络中控制随机接入的例子linear-mesh 阅读详情

相关推荐

Stata:手动安装ivreghdfe包的完整指南与常见问题解决

本文提供了Stata中手动安装ivreghdfe包的完整指南,包括准备工作、详细安装步骤及常见问题解决方案。ivreghdfe作为处理高维固定效应模型的强大工具,依赖ftools、reghdfe和ivreg2三个核心组件,手动安装可避免版本冲突问题。文章还分享了进阶使用技巧,如并行计算加速和保存固定效应估计值,助力用户高效完成工具变量回归分析。

weixin_29251131的博客 929

Ruby编程线程池案例二详解

本例可以观察到线程池tg.freeze前后的状态

临风暖阳的博客 173

CSP-J 初赛模拟卷1 题解

只有一棵子树有后继,其他的都是叶结点才能保证树的深度最大,此时还剩(n-5)个结点,最后加上2,得到(n-3),即为答案。题解:先修改p的指针域,让它的左指针域指向q,然后再让q的右指针域赋值给p的右指针域,再然后修改q的右指针域使其指向p,最后需要改变的指针域就是原先q结点的后继节点的左指针域内容。设n个元素的入栈序列是1,2,3,...,n,出栈序列为p1,p2,...,pn,若p1=n,则pi(1≤i≤n)的值为(1)输入的三个数中,第二个数应是[0,11]上的整数,否则会出现数组越界的问题。

Sat77GryHp_Pro的博客 2805

Ruby中式编程之线程二及代码行级优化

def 姜修艳 陈翔宇=0 while 陈翔宇<=2 puts “姜修艳 at: #{Time.now}” sleep(2) 陈翔宇=陈翔宇+1 end end def 周慧慧 陈鸿玮=0 while 陈鸿玮<=2 puts “周慧慧 at: #{Time.now}” sleep(1) 陈鸿玮=陈鸿玮+1 end end puts “开始于 #{Time.now}” 陈元才=Thread.new{姜修艳()} 陈鹏飞=Thread.new{周慧慧()} 陈元才.join 陈鹏飞.join pu.

临风暖阳的博客 252

抖音自定义卡片链接(图文链接)

抖音自定义可以自定义标题,打开链接,和展示图片 效果 主要代码 public void sendMessage(String conversationId, Object aBaseContent) throws Exception { // C233282u5.LIZIZ.LIZ().LIZIZ(LIZ).LIZ(obtain).LIZ(hLn).LIZ((AbstractC59811HHc) new H9Q()); Object HOa = ReflectionUtil

傅恒的博客 4140

Tomcat漏洞——弱口令爆破

靶机:CentOS7 IP:192.168.100.40。攻击机:kali IP:192.168.100.60。版 权 声 明:本博客所有文章除特别声明外,均采用。文章版权归作者所有,未经允许请勿转载!作 者:PeiyuJue。

weixin_57379923的博客 909

Ruby语言的多线程编程

线程是程序中执行的最小单元,它是在进程中运行的一条执行路径。每个线程都有自己的栈空间和局部变量,但它们共享同一进程的内存空间。多个线程可以并发执行,从而实现更高效的资源利用。

2501_90407275的博客 1522

Linux 桌面虚拟化技术 KVM

Linux 桌面虚拟化技术 KVM

高飞的博客 36万+

ruby 线程id_Ruby中的线程

ruby 线程id Ruby线程 (Ruby Threads) In Ruby, with the help of threads, you can implement more than one process at the same time or it can be said that Thread supports concurrent programming model. Apart f...

cumtb2002的博客 411

【VibeCoding系列】小白入门指南:模型选择、编辑器选择、项目预定全分析

开箱即用:下载安装就能用,不用配 API Key(也可以自己配)Cmd+K 快速修改:选中代码,按 Cmd+K,直接让 AI 修改Cmd+L 对话:侧边栏聊天,支持引用文件和代码@文件引用:输入 @ 就能引用项目中的文件,AI 自动读取上下文Agent 模式:告诉 AI 一个需求,它自动跨文件修改下载地址cursor.com(免费版有额度限制,足够入门)✅下载 Cursorcursor.com),安装打开✅选一个小项目(个人名片页 or Todo List)✅按照七步工作流开干。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 210

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 201

ruby多线程_Ruby中的多线程

ruby多线程 Ruby多线程 (Ruby Multithreading) If we talk about a normal program in Ruby, all statements are executed sequentially because it used to have a single thread commonly known as the main thread. But...

cumubi7552的博客 556

【系统安全】Windows内核权限提升漏洞(CVE-2024-30088)

CVE-2024-30088是Windows内核提权漏洞,由越南安全研究员@Bùi Quang Hiếu详细分析。漏洞发生在AuthzBasepCopyoutInternalSecurityAttributes函数中,该函数在复制SecurityAttributesList时会使用用户提供的指针,在校验及复制期间存在时间差,导致存在TOCTOU漏洞。

李同學AI安全 1325

ruby线程控制,线程同步

在Ruby中线程是用户级线程并依赖与操作系统。线程是进程中的一个实体,是被系统独立调度和分配的基本单位。线程可以与同属于同样个进程的其他线程共同共享进程的全部资源。但是线程不拥有资源,只需要一点在运行时必不可少的资源。 线程的基本控制,如果主进程结束,会结束所有的线程。所以如果你的线程在执行显示的任务,但是主进程却已经执行完毕,会看不到线程的任何输出。如链接中所示: http://bl

Work Hard, Play Harder! 5153

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Ruby学习之多线程的使用方式

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是程序中一个单一的顺序控制流程,在单个程序中同时运行多个线程完成不同的工作,称为多线程。Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码,来看下启动一个新的线程的代码格式: # 线程 #1 代码部分 Thread.new { # 线程 #2 执行代码 }...

luyaran的博客 2793

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: Intype 下载
下一篇: Myeclipse下使用svn进行源码管理
refactaar
博客等级 码龄17年 0粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值