2014-11-27 23 views
5

Ho scritto un server che esegue il routing di nuovi thread. Alcuni di questi thread devono scrivere sullo standard output, ma quando lo fanno, nulla viene visualizzato nel terminale.I thread multipli SBCL scrivono sull'uscita standard

C'è qualche tipo di API di messaggistica in sbcl che mi consente di inviare messaggi al thread principale?

Grazie mille!

risposta

10

È necessario passare l'attuale *standard-output* al nuovo thread in qualche modo, quindi nella funzione di quel thread, è possibile associare *standard-output* a tale valore.

Le attuali implementazioni comuni di Lisp rendono i collegamenti dinamici locali a thread e 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*)) 

Nota che avrei potuto chiamato argomento della funzione di filo *standard-output* e poi non avrei bisogno del let, dal momento che il binding dinamico è stato fatto a ingresso della funzione. Ma penso che i legami dinamici dovrebbero essere espliciti ed evidenti, nonostante i paraorecchie che circondano la convenzione di denominazione delle variabili speciali.