Hi All,
New to this list and srfi-18 threads. I want to make use of parameters
in a thread-safe way, but I have run into problems. It seems to me that
parameters created in one thread cannot be manipulated in a persistent
way from another thread. Here is some example code showing what I mean:
(use srfi-18)
;; mutex-protect parameter
(define (make-synchronized-parameter value)
(let ((mutex (make-mutex))
(param (make-parameter value)))
(lambda args
(mutex-lock! mutex)
(let ((result (apply param args)))
(mutex-unlock! mutex)
result))))
(define *safe-param* (make-synchronized-parameter #f)) (define
*unsafe-global* #f)
(define (mutate-things)
(set! *unsafe-global* 42)
(*safe-param* 42)
(print "2thread> unsafe-global is "*unsafe-global*" safe-param is
"(*safe-param*))
(thread-sleep! 2) ;; make global safe for test
(print "4thread> just before exit unsafe-global is "*unsafe-global*"
safe-param is "(*safe-param*)))
(define (main)
(let* ((thread (make-thread mutate-things)))
(print "1main> before thread-start unsafe-global is
"*unsafe-global*" safe-param is "(*safe-param*))
(thread-start! thread)
(thread-sleep! 1) ;; make global safe for test
(print "3main> before thread-join unsafe-global is "*unsafe-global*"
safe-param is "(*safe-param*))
(thread-join! thread)
(print "5main> after thread-join unsafe-global is "*unsafe-global*"
safe-param is "(*safe-param*))))
(main)
;; actual stdout:
;; 1main> before thread-start unsafe-global is #f safe-param is #f
;; 2thread> unsafe-global is 42 safe-param is 42
;; 3main> before thread-join unsafe-global is 42 safe-param is #f
;; 4thread> just before exit unsafe-global is 42 safe-param is 42
;; 5main> after thread-join unsafe-global is 42 safe-param is #f
;; expected stdout for line 5:
;; 5main> after thread-join unsafe-global is 42 safe-param is 42
;; Why does the mutation of a simple global in a thread become visible
to the main thread, but the mutation of global parameter does not?
;; What is the right way to achieve an thread-safe parameter?
Thank you!
-Brandon
_______________________________________________
Chicken-users mailing list
Chicken-users@nongnu.org
https://lists.nongnu.org/mailman/listinfo/chicken-users