/ / Semafori rubini? - rubino, mutex, semaforo

Ruby Semaphores? - rubino, mutex, semaforo

Sto lavorando ad un'implementazione della "FieraBarbiere "problema in Ruby. Questo è per un compito in classe, ma non sto cercando dispense. Ho cercato come un matto, ma non riesco a trovare un'implementazione Ruby di semafori che rispecchi quelli trovati in C.

So che c'è Mutex, ed è fantastico. Una singola implementazione fa esattamente quello che dovrebbe fare quel tipo di semaforo.

Poi ci sono le variabili di condizione. Ho pensato che avrebbe funzionato alla grande, ma guardando a questi, hanno bisogno di un Mutex per ogni chiamata di attesa, che mi sembra come se non potessi mettere valori numerici nel semaforo (come in, ho sette barbieri, 3 barbieri, ecc.).

Penso di aver bisogno di un conteggio semaforo, ma penso che sia un po 'strano che Ruby (da quello che posso trovare) non contenga una tale classe nel suo nucleo. Qualcuno può aiutarmi a indicarmi la giusta direzione?

risposte:

4 per risposta № 1

Se si utilizza JRuby, è possibile importare semafori da Java come mostrato in Questo articolo.

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 per risposta № 2

There "s http://sysvipc.rubyforge.org/SysVIPC.html che ti dà semafori SysV. Ruby è perfetto per eliminare le imperfezioni API dei semafori SysV e i semafori SysV sono i migliori in circolazione: sono semafori tra processi, puoi usare SEM_UNDO in modo che anche i SIGKILL non rovinino il tuo stato globale (i semafori interprocesso POSIX non hanno questo ) e tu con i semafori SysV puoi eseguire operazioni atomiche su più semafori contemporaneamente purché siano nello stesso set di semafori.

Per quanto riguarda i semafori inter-thread, questi dovrebbero essere perfettamente emulabili con variabili di condizione e mutex. (Vedi il link di Bernanrdo Martinez per come fare).


1 per risposta № 3

Ho trovato anche questo codice: https://gist.github.com/pettyjamesm/3746457

probabilmente a qualcuno potrebbe piacere quest'altra opzione.


0 per risposta № 4

Grazie a @ x3ro per il suo link. Questo mi ha indicato la giusta direzione. Tuttavia, con l'implementazione che Fukumoto ha dato (almeno per rb1.9.2) Thread.critical non è disponibile. Inoltre, i miei tentativi di sostituire le chiamate Thread.critical con Thread.exclusive {} hanno semplicemente portato a deadlock. c'è una proposta di patch Semaphore per Ruby (che ho "linkato sotto") che ha risolto il problema sostituendo Thread.exclusive {} con un Mutex :: synchronize {}, tra poche altre modifiche. Grazie a @ x3ro per avermi spinto nella giusta direzione.

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


0 per risposta № 5

Dato che gli altri link qui non funzionano per me,Ho deciso di hackerare rapidamente qualcosa insieme. Non l'ho testato, quindi input e correzioni sono i benvenuti. Si basa semplicemente sull'idea che un Mutex è un semaforo binario, quindi un semaforo è un insieme di mutex.

https://gist.github.com/3439373


0 per risposta № 6

poiché il rubino concorrente è stabile (oltre 1.0) e viene ampiamente utilizzato, quindi la migliore (e portatile soluzione di Ruby impls) è quella di utilizzarla Concurrent::Semaphore classe