2014-11-27 6 views
5

Ich schrieb einen Server, der neue Threads abspinnt. Einige dieser Threads müssen auf die Standardausgabe schreiben, aber wenn sie dies tun, wird im Terminal nichts angezeigt.SBCL mehrere Threads schreiben auf Standard-Ausgabe

Gibt es eine Art von Messaging-API in sbcl, die es mir ermöglicht, Nachrichten an den Haupt-Thread zu senden?

Vielen Dank!

Antwort

10

Sie müssen die aktuelle *standard-output* irgendwie an den neuen Thread übergeben, dann können Sie in dieser Thread-Funktion *standard-output* an diesen Wert binden.

Aktuelle Common Lisp-Implementierungen machen threadlokale dynamische Bindungen und SBCL is one of them.

(sb-thread:make-thread ;; thread function 
         #'(lambda (standard-output) 
          ;; thread-local dynamic binding of special variable 
          (let ((*standard-output* standard-output)) 
          ...)) 
         ;; thread function argument, provided by the current thread 
         :arguments (list *standard-output*)) 

Bitte beachte, dass ich die Thread-Funktion Argument *standard-output* genannt hätte und dann würde ich nicht die let brauchen, da die Dynamik bei Funktionseingabe erfolgt Bindung wurde. Aber ich denke, dass dynamische Bindungen explizit und offensichtlich sein sollten, ungeachtet der Ohrenschützer um besondere variable Namenskonventionen.