2011-03-29 26 views
14

Estoy trabajando en una implementación del problema "Fair Barbershop" en Ruby. Esto es para una tarea de clase, pero no estoy buscando folletos. He estado buscando como loco, pero parece que no puedo encontrar una implementación Ruby de semáforos que reflejen los encontrados en C.Ruby Semaphores?

Sé que es Mutex, y eso es genial. La implementación única hace exactamente lo que ese tipo de semáforo debería hacer.

Luego están las variables de condición. Pensé que esto iba a funcionar muy bien, pero mirando esto, requieren un Mutex para cada llamada de espera, que me parece que no puedo poner valores numéricos al semáforo (como en, tengo siete barberías, 3 barberos, etc.).

Creo que necesito un Semáforo de conteo, pero creo que es un poco extraño que Ruby no contenga (por lo que puedo encontrar) en su núcleo. ¿Puede alguien ayudarme apuntar en la dirección correcta?

+2

¿Qué hay de esto: http: // www .imasy.or.jp/~ fukumoto/ruby ​​/ semáforo.rb? – fresskoma

+0

Con algunos ajustes esto parece ser exactamente lo que estaba buscando. El material Thread.critical aparentemente no funciona en 1.9, así que lo reemplacé con un bloque Thread.exclusive {}.Todavía no entiendo por qué esto no forma parte de las bibliotecas centrales de Ruby. –

+0

Parece que el servidor de imasy.or.jp se ha ido o no funciona ... ¿Alguien tiene un enlace actualizado? –

Respuesta

0

Gracias a @ x3ro por su enlace. Eso me apuntó en la dirección correcta. Sin embargo, con la implementación que dio Fukumoto (al menos para rb1.9.2) Thread.critical no está disponible. Además, mis intentos de reemplazar las llamadas Thread.critical con Thread.exclusive {} simplemente dieron como resultado deadlocks. Resulta que hay un parche Semaphore propuesto para Ruby (que he vinculado a continuación) que ha resuelto el problema al reemplazar Thread.exclusive {} con Mutex :: synchronize {}, entre algunos otros ajustes. Gracias a @x3ro por empujarme en la dirección correcta.

http://redmine.ruby-lang.org/attachments/1109/final-semaphore.patch

+2

Cuando intento acceder a esa página, aparece un error no autorizado. –

+0

Obtengo un 403 también ... –

0

Dado que los otros que enlaza aquí no están funcionando para mí, decidí cortar rápidamente algo juntos. No lo he probado, así que los comentarios y las correcciones son bienvenidos. Se basa simplemente en la idea de que un Mutex es un Semáforo binario, por lo tanto, un Semáforo es un conjunto de Mutexes.

https://gist.github.com/3439373

4

Si está usando JRuby, puede importar los semáforos de Java como se muestra en la this article.

require 'java' 

java_import 'java.util.concurrent.Semaphore' 

SEM = Semaphore.new(limit_of_simultaneous_threads) 
SEM.acquire #To decrement the number available 
SEM.release #To increment the number available 
2

Hay http://sysvipc.rubyforge.org/SysVIPC.html que le proporciona semáforos SysV. Ruby es perfecto para eliminar las imperfecciones API de los semáforos SysV y los semáforos SysV son los mejores: son semáforos entre procesos, puedes usar SEM_UNDO para que incluso los SIGKILL no arruinen tu estado global (los semáforos POSP entreprocesos no tienen este), y usted con semáforos SysV puede realizar operaciones atómicas en varios semáforos a la vez, siempre y cuando estén en el mismo conjunto de semáforos.

En cuanto a los semáforos entre hilos, estos deberían ser perfectamente emulables con las variables de condición y los mutexes. (Vea el enlace de Bernanrdo Martinez para saber cómo se puede hacer).

0

desde concurrente-rubí es estable (más allá de 1,0) y está siendo ampliamente utilizado por lo tanto el mejor (y portable a través de impls rubí) solución es utilizar su clase Concurrent::Semaphore