Re: Maxima and thread safety
David Scherfgen via Maxima-discuss <[email protected]> Tue, 9 Jun 2026 18:41:59 +0200
| Newsgroups | gmane.comp.mathematics.maxima.general |
|---|---|
| Message-ID | <CAMTHLKg+cK8fh=d2+MOjdTtWC2muP0wDmx2wZAreS65kfS+LOg@mail.gmail.com> |
Yes, but we try it with the ..._threads.lisp file. The one you tried uses multiple processes, which are completely isolated from each other. Leo Butler <[email protected]> schrieb am Di., 9. Juni 2026, 18:25: > Hi David, > > I cannot reproduce your crash using `distribute_over_tranches_mt.lisp' > from Michel's github repo. > > I played around with the number of threads (1, 4, 8) and your example works > fine and it clearly is using multiple threads. > > Leo > > Maxima-version: "branch_5_49_base_416_g162a6093a_dirty" > Maxima build date: "2026-06-08 12:29:08" > Host type: "x86_64-unknown-linux-gnu" > Lisp implementation type: "SBCL" > Lisp implementation version: "2.6.4.debian" > User dir: "/dev/null" > Temp dir: "/tmp" > Object dir: > "/home/butlerlt/maxima/sandbox/git/maxima-code/binary/branch_5_49_base_416_g162a6093a_dirty/sbcl/2_6_4_debian" > Frontend: false > > > On Tue, Jun 09 2026, David Scherfgen via Maxima-discuss < > [email protected]> wrote: > > > Hi Michel, > > > > You might add this to your examples: > > > > distribute_over_tranches( > > '(block( > > [x_n: float(N), x_next, i], > > for i : 1 thru 1000 do ( > > x_next: 0.5 * (x_n + N / x_n), > > x_n: x_next > > ), > > x_n)), > > N, 1000, 16); > > > > Nothing fancy, it's Newton's algorithm to compute the square root, with a > > fixed number of iterations, just for demonstration purposes. > > Note that I have done everything possible to make sure that the variables > > x_n, x_next, i are local, by using a block. > > But yet, the calculation crashes as soon as one uses more than 1 thread. > > So, the situation is even more delicate than I thought. > > > > Best regards > > David > > > > Am Di., 9. Juni 2026 um 16:45 Uhr schrieb Michel Talon < > > [email protected]>: > > > >> I have updated the README in > >> > >> https://github.com/mtalon/mtalon/tree/master/mtalon/maxima-parallel > >> > >> to reflect David insightful examples. > >> > >> Finally "distribute_over_tranches_thread.lisp" is another way to > >> achieve the same parallelism, using threads in just one Unix > >> process. Here we use the sbcl threading support. For sufficiently > >> independent computations one may expect to get correct behaviour. > >> However if threads modify the internal state of maxima chaos can > >> occur. Examples have been provided by David Scherfgen, notably: > >> distribute_over_tranches('(concat('v, i) :: i), i, 10000, 16)$ > >> which under the hood affect the global variable $values, so at the end > >> one gets length($values) different from 10000. The problem is that > special > >> variables with global extent are not bound in thread local storage, but > >> can be read and modified independently by all threads. But they are not > >> protected by a mutex. > >> A small lisp program which shows the behavior of such special global > variables is: > >> > >> ;;; We are in main thread > >> (defparameter *x* 0) > >> (format nil "~a" *x*) ;;; value of global *x* in main thread > >> (let ((*x* 1)) > >> a (format t "~a ~%" *x*) ;;; value of *x* in main thread TLS > >> (sb-thread:make-thread (lambda () ;;; spawning new thread > >> (format t "~a ~%" *x*) ;;; value of *x* in new > thread, the global one. > >> (setq *x* 3) > >> (format t "~a ~%" *x*) ;;; altered value of *x* > in new thread > >> "Sorry! *x* in main thread is not isolated."))) > >> (format nil "~a" *x*) ;;; The global value of *x* has been altered > in main thread > >> > >> However i still believe that the threading program may be very useful > to distribute a bunch of "ordinary standard" > >> computations over the many cores of modern processors. For example > running the same computation a hundred of times for > >> different values of parameters which may take hours of compute time, > will be scaled down basically by the number of cores. > >> Fortunately special variables bound locally in a let form or similar > (this being called dynamically bound) get bound in TLS > >> (thread local storage) which isolates them from thread to thread, so > that most parts of maxima can still work OK. > >> > >> > >> Le 07/06/2026 à 16:55, David Scherfgen a écrit : > >> > >> > >> Unfortunately, Maxima has many hidden side effects that are surprising > to > >> the average user. The following innocent looking example simply creates > >> Maxima variables v1, v2, v3, ..., v10000 in 16 parallel threads: > >> > >> -- > >> Michel Talon > >> > >> _______________________________________________ > >> Maxima-discuss mailing list > >> [email protected] > >> https://lists.sourceforge.net/lists/listinfo/maxima-discuss > >> > > > > _______________________________________________ > > Maxima-discuss mailing list > > [email protected] > > https://lists.sourceforge.net/lists/listinfo/maxima-discuss > > > > -- > --- > Best regards, > Dr Butler _______________________________________________ Maxima-discuss mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/maxima-discuss