2014-11-27 14 views
5

Napisałem serwer, który obraca nowe wątki. Niektóre z tych wątków muszą pisać do standardowego wyjścia, ale kiedy to robią, nic nie pojawia się w terminalu.Wiele wątków SBCL napisz do standardowego wyjścia

Czy istnieje jakiś typ interfejsu komunikacyjnego w sbcl, który pozwala mi wysyłać wiadomości z powrotem do głównego wątku?

Wielkie dzięki!

Odpowiedz

10

Musisz jak najszybciej przekazać bieżący numer *standard-output* do nowego wątku, a następnie w funkcji tego wątku możesz powiązać *standard-output* z tą wartością.

Obecne implementacje Common Lisp tworzą powiązania dynamiczne wątku lokalnego i 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*)) 

Zauważ, że mógłbym nazwany argument funkcji wątku za *standard-output* i wtedy nie musiałby się let, ponieważ dynamiczne wiązanie zostało wykonane przy wejściu funkcji. Ale myślę, że dynamiczne wiązania powinny być wyraźne i oczywiste, niezależnie od nauszników wokół specjalnej konwencji zmiennych nazw.

Powiązane problemy