Ich kann nicht an der richtigen Stelle für die documentation of lparallel.queue suchen, aber können wir davon ausgehen, dass diese Warteschlangen thread-sicher sind und dass die Warteschlangen kümmern sich um alle Sperren/Entsperren selbst, so dass der Benutzer der Warteschlangen nicht haben explizit sperren/entriegeln? Wenn dies irgendwo dokumentiert ist, würde ich den Link schätzen.Lparallel.queue thread-safe?
2
A
Antwort
3
Ich weiß nicht, wo es angegeben, aber Blick auf den Code zeigt, dass die Warteschlange Funktionen sind tatsächlich threadsicher.
Die Warteschlangenfunktionen erweitern, um alle Anrufe in DEFINE-LOCKING-FN
was wiederum zu einem DEFINE-LOCKING-FN/BASE
erweitert, die in einem WITH-LOCK-HELD
umwickelt mit dem Inhalt in einem DEFUN
der Funktion führt.
3
Mit Blick auf den Quellcode scheinen die Warteschlangen gesperrt zu sein.
(define-queue-fn push-queue (object queue)
push-cons-queue
push-vector-queue)
...
(define-locking-fn push-cons-queue (object queue) (t cons-queue) (values) lock
(with-cons-queue-slots (impl cvar) queue
(push-raw-queue object impl)
(when cvar
(condition-notify cvar)))
(values))
die entriegelte Funktionen haben einen eigenen Namen:
(define-queue-fn push-queue/no-lock (object queue)
push-cons-queue/no-lock
push-vector-queue/no-lock)