<div dir="ltr"><div>Just an update on the issue - I tested the code with ECL and it works fine.<br><br></div>--Vijay<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Mar 21, 2013 at 10:21 PM, David L. Rager <span dir="ltr"><<a href="mailto:ragerdl@gmail.com" target="_blank">ragerdl@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">FYI, here's my multi-threading interface, which works well on CCL and<br>
should work on SBCL and LispWorks (but I test these lisps less often).<br>
<br>
<a href="http://www.cs.utexas.edu/users/moore/acl2/current/distrib/acl2-sources/multi-threading-raw.lisp" target="_blank">http://www.cs.utexas.edu/users/moore/acl2/current/distrib/acl2-sources/multi-threading-raw.lisp</a><br>

<br>
And here's my futures implementation.  I originally omitted it because<br>
it has some features you won't need (catching and rethrowing a given<br>
set of tags), and it's missing something that Sedach's does provide<br>
(error catching and rethrowing... iirc):<br>
<br>
<a href="http://www.cs.utexas.edu/users/moore/acl2/current/distrib/acl2-sources/futures-raw.lisp" target="_blank">http://www.cs.utexas.edu/users/moore/acl2/current/distrib/acl2-sources/futures-raw.lisp</a><br>
<br>
On Thu, Mar 21, 2013 at 11:38 AM, Vijay Mathew<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:vijay.the.lisper@gmail.com">vijay.the.lisper@gmail.com</a>> wrote:<br>
> Hi David,<br>
><br>
> Thanks for your reply.<br>
> I wrote the futures library just as an exercise for learning Common Lisp.<br>
> You can download it here: <a href="http://ubuntuone.com/4XEnbbdvhccGOqC6WqGJ3S" target="_blank">http://ubuntuone.com/4XEnbbdvhccGOqC6WqGJ3S</a>. BTW,<br>
> I am still debugging it!<br>
><br>
> I am on CCL 1.10 dev trunk.<br>
><br>
> Thanks,<br>
><br>
> --Vijay<br>
><br>
><br>
> On Thu, Mar 21, 2013 at 7:57 PM, David L. Rager <<a href="mailto:ragerdl@gmail.com">ragerdl@gmail.com</a>> wrote:<br>
>><br>
>> Hi Vijay,<br>
>><br>
>> Welcome to the world of CCL threads!<br>
>><br>
>> I don't yet know the answer to your first question.  However, maybe<br>
>> you can figure it out with this debugging hint:  I have my own<br>
>> multi-threading package, so this will look like pseudo-code.  The most<br>
>> common thing I do is interrupt a thread and view its backtrace, which<br>
>> should help you in this instance.<br>
>><br>
>> (all-threads)  ; or :proc, or (ccl:all-processes) iirc<br>
>> (interrupt-thread (nth <n> (all-threads)) #'break)<br>
>> :y <thread-number-to-yield-to><br>
>> :b ; for backtrace<br>
>> <other common debugging features><br>
>><br>
>> Is your futures library available?  There are various Lisp libraries<br>
>> that provide parallel execution.  For example, Vladamir Sedach<br>
>> provides an eager futures library [<br>
>> <a href="http://common-lisp.net/project/eager-future/" target="_blank">http://common-lisp.net/project/eager-future/</a> ].  Also, I provide a<br>
>> "plet" primitive (and others, like "spec-mv-let") for ACL2, which is<br>
>> built on top of CL [<br>
>> <a href="http://www.cs.utexas.edu/users/moore/acl2/current/PLET.html" target="_blank">http://www.cs.utexas.edu/users/moore/acl2/current/PLET.html</a> ].  If<br>
>> you'd like more information about the latter, feel free to inquire<br>
>> (probably off the list-serve).<br>
>><br>
>> David<br>
>><br>
>> PS -- setf can be different than just using let.  Maybe using or not<br>
>> using special variables is part of the issue?<br>
>> PPS -- are you on CCL 1.9 or later?  There was a bug for a little bit<br>
>> right before the 1.9 release, but I'd be surprised if you were hitting<br>
>> it in this simple test case.<br>
>><br>
>><br>
>> On Thu, Mar 21, 2013 at 5:41 AM, Vijay Mathew<br>
>> <<a href="mailto:vijay.the.lisper@gmail.com">vijay.the.lisper@gmail.com</a>> wrote:<br>
>> > Consider this code snippet which demonstrates a "futures" package for<br>
>> > executing computations asynchronously:<br>
>> ><br>
>> > (setf e (futures:make-pool-executor 2))<br>
>> > (setf f1 (futures:executor-submit e #'(lambda (x) (* x 2)) 100))<br>
>> > (setf f2 (futures:executor-submit e #'(lambda (x y) (+ x y)) 200 300))<br>
>> > (format t "~A~%" (futures:future-result f1))<br>
>> > (format t "~A~%" (futures:future-result f2))<br>
>> > (futures:executor-shutdown e nil)<br>
>> ><br>
>> > `pool-executor' internally uses a pool of ccl threads for executing the<br>
>> > jobs<br>
>> > submitted to it. Now if I rewrite the same sample using `let' bindings,<br>
>> > the<br>
>> > call to `future-result' just hangs. The threads actually run, but it<br>
>> > seems<br>
>> > `future-result' somehow do not see the updated value of the internal<br>
>> > `result' slot.<br>
>> ><br>
>> > If I load this script, it just hangs the CCL REPL:<br>
>> ><br>
>> > (let ((e (futures:make-pool-executor 2)))<br>
>> >   (let ((f1 (futures:executor-submit e #'(lambda (x) (* x 2)) 100))<br>
>> >         (f2 (futures:executor-submit e #'(lambda (x y) (+ x y)) 200<br>
>> > 300)))<br>
>> >     (format t "~A~%" (futures:future-result f1))<br>
>> >     (format t "~A~%" (futures:future-result f2))<br>
>> >     (futures:executor-shutdown e nil)))<br>
>> ><br>
>> > Also I would like to learn about the best way to debug programs that use<br>
>> > CCL<br>
>> > threads.<br>
>> ><br>
>> > I am new to Common Lisp and the kind of support I am getting from this<br>
>> > mailing list is very encouraging!<br>
>> ><br>
>> > Thank you,<br>
>> ><br>
>> > --Vijay<br>
>> ><br>
>> ><br>
>> > _______________________________________________<br>
>> > Openmcl-devel mailing list<br>
>> > <a href="mailto:Openmcl-devel@clozure.com">Openmcl-devel@clozure.com</a><br>
>> > <a href="http://clozure.com/mailman/listinfo/openmcl-devel" target="_blank">http://clozure.com/mailman/listinfo/openmcl-devel</a><br>
>> ><br>
><br>
><br>
</div></div></blockquote></div><br></div>