Hello,

Here's maybe the easiest way, with locking:

(defn give-message [message]
  (locking *out*
    (println (format "%s: %s" (. time-format format (. (now) getTime)) 
message))))

Of course, locks can introduce their own problems, so maybe the next 
easiest way is with the combination of agent and send-off:

(def out (agent *out*))

(defn give-message [message]
  (send-off out
   #(binding [*out* %]
     (println (format "%s: %s" (. time-format format (. (now) getTime)) 
message))
     %)))

Like with a core.async approach, this gives you queue-wise execution of 
give-message requests.  Unlike with core.async, you don't need to manage 
your own consume/print thread.  Personally, I wouldn't go with core.async 
until I was working with multiple consumers or had the need to 'combine' 
resources.

Alan

On Friday, April 11, 2014 9:35:52 AM UTC-4, Cecil Westerhof wrote:
>
> I have the following functions in my concurrent program:
> (def time-format (new java.text.SimpleDateFormat "HH:mm:ss"))
>
> (defn now []
>   (new java.util.GregorianCalendar))
>
> (defn give-message [message]
>   (println (format "%s: %s" (. time-format format (. (now) getTime)) 
> message)))
>
>
> But sometimes a new message from a different thread is displayed, before 
> the current message is ready:
> 10:34:57: Different for      4194573 (9.313226e-10, 2.220304e-16)10:34:57: 
> Different for      4198042 (9.313226e-10, 2.218469e-16)
>
> 10:34:57: Different for      8389473 (1.862645e-09, 2.220217e-16)
>
>
> Is there a way to make give-message atomic, so it would be displayed as:
> 10:34:57: Different for      4194573 (9.313226e-10, 2.220304e-16)
> 10:34:57: Different for      4198042 (9.313226e-10, 2.218469e-16)
> 10:34:57: Different for      8389473 (1.862645e-09, 2.220217e-16)
>
>
> I attached the complete program. Any hints to implement it better are 
> appreciated.
>
> -- 
> Cecil Westerhof 
>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to