Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何计算等待互斥的线程数?_Ruby_Concurrency_Mutex - Fatal编程技术网

Ruby 如何计算等待互斥的线程数?

Ruby 如何计算等待互斥的线程数?,ruby,concurrency,mutex,Ruby,Concurrency,Mutex,有没有内置的方法来计算等待互斥锁的线程数 例如: m= Mutex.new 2.times do Thread.new do m.lock end end m.nb_waiting_threads # => 1 没有内置的方法来计算等待互斥体的线程数,但是如果您可以将问题转换为使用队列,则有一种方法 要使用队列模拟互斥,您可以使用pop获取锁,然后通过按下并输入值来释放锁。您的不变量是队列在任何给定时刻仅包含0或1项 require 'thread' semapho

有没有内置的方法来计算等待互斥锁的线程数

例如:

m= Mutex.new

2.times do
  Thread.new do
    m.lock
  end
end

m.nb_waiting_threads # => 1

没有内置的方法来计算等待
互斥体的线程数,但是如果您可以将问题转换为使用
队列
,则有一种方法

要使用
队列模拟
互斥
,您可以使用
pop
获取锁,然后通过
按下
并输入值来释放锁。您的不变量是队列在任何给定时刻仅包含0或1项

require 'thread'

semaphore = Queue.new
semaphore.push(1) # Make synchronization token available

threads = []
5.times do |i|
  threads << Thread.new do
    semaphore.pop # Blocks until token available
    puts "Thread #{i} working, #{semaphore.num_waiting} threads waiting."
    sleep rand(3) # Do work
    semaphore.push(1) # Release token
  end
end

threads.each(&:join)

我看不远。你为什么需要这个?别上当了,谢谢!这是一个很好的问题解决方案:)
$ ruby queue_lock.rb
Thread 0 working, 0 threads waiting.
Thread 1 working, 3 threads waiting.
Thread 3 working, 2 threads waiting.
Thread 2 working, 1 threads waiting.
Thread 4 working, 0 threads waiting.