【问题标题】:Ruby multithreading queuesRuby 多线程队列
【发布时间】:2013-10-25 06:17:52
【问题描述】:

我在同步线程时遇到问题,我不知道该怎么做,有人可以帮助我吗?

所以,问题是我必须以特定的顺序启动线程。 顺序如下:

线程 1 和 7 可以同时运行,其中一个完成后,启动下一个线程(即线程 2 或/和线程 6),线程 3 和 5 也是如此。 最后一个,在线程 3 和 5 都运行完之后,进入最后一个,线程 4。

这是我开始的代码,但不知何故我被困在队列实现中。

MUTEX          = Mutex.new
high_condition = ConditionVariable.new
low_condition  = ConditionVariable.new
threads = []

7.times do |i|
  threads << Thread.new{
    MUTEX.synchronize {
      Thread.current["number"] = i

      you_shall_not_pass
    }
  }
end

threads.map(&:join)

def you_shall_not_pass
  order = Thread.current["number"]
end

【问题讨论】:

  • 你能告诉我们更多关于预期输出和你得到什么吗?
  • 欢迎来到 StackOverflow!感谢您发布您的代码,但请在您的问题中添加更多描述:您遇到什么问题,您期望的结果是什么,到目前为止what have you tried?通过question checklist 将帮助我们更好地回答您的问题。谢谢!
  • 预期的输出可能类似于: ` Thread1 已完成其任务 Thread2 已完成其任务 Thread7 已完成其任务 Thread3 已完成其任务 Thread6 已完成其任务 Thread5 已完成其任务 Thread4 已完成它的任务`输出并不重要,问题是以适当的方式启动它们
  • 这是一个真正的要求,还是一些练习?
  • 更多的练习,这将有助于以后的一些工作流程

标签: ruby multithreading mutex semaphore


【解决方案1】:

使用 Ruby 的Queue 作为counting semaphore。它具有阻塞 pushpop 操作,您可以使用这些操作将有限数量的令牌分发给线程,要求每个线程在运行之前获取一个令牌并在完成时释放该令牌。如果您使用 2 个令牌初始化队列,则可以确保一次只运行 2 个线程,并且您可以按照您喜欢的任何顺序创建线程。

require 'thread'

semaphore = Queue.new
2.times { semaphore.push(1) } # Add two concurrency tokens

puts "#{semaphore.size} available tokens"

threads = []
[1, 7, 2, 6, 3, 5, 4].each do |i|
  puts "Enqueueing thread #{i}"
  threads << Thread.new do
    semaphore.pop # Acquire token
    puts "#{Time.now} Thread #{i} running. #{semaphore.size} available tokens. #{semaphore.num_waiting} threads waiting."
    sleep(rand(10)) # Simulate work
    semaphore.push(1) # Release token
  end
end

threads.each(&:join)

puts "#{semaphore.size} available tokens"
$ ruby counting_semaphore.rb
2 available tokens
Enqueueing thread 1
Enqueueing thread 7
2015-12-04 08:17:11 -0800 Thread 7 running. 1 available tokens. 0 threads waiting.
2015-12-04 08:17:11 -0800 Thread 1 running. 0 available tokens. 0 threads waiting.
Enqueueing thread 2
Enqueueing thread 6
2015-12-04 08:17:11 -0800 Thread 2 running. 0 available tokens. 0 threads waiting.
Enqueueing thread 3
Enqueueing thread 5
Enqueueing thread 4
2015-12-04 08:17:19 -0800 Thread 6 running. 0 available tokens. 3 threads waiting.
2015-12-04 08:17:19 -0800 Thread 5 running. 0 available tokens. 2 threads waiting.
2015-12-04 08:17:21 -0800 Thread 3 running. 0 available tokens. 1 threads waiting.
2015-12-04 08:17:22 -0800 Thread 4 running. 0 available tokens. 0 threads waiting.
2 available tokens

【讨论】:

    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2013-06-18
    • 2013-04-18
    • 2011-09-17
    • 2012-11-12
    相关资源
    最近更新 更多