As far as the write-write order is preserved, reordering eliminates the
race and I don't see new problems.


On Sun, Mar 12, 2023 at 5:59 AM Marc Nieper-Wißkirchen <
marc.nie...@gmail.com> wrote:

> Am Sa., 11. März 2023 um 20:29 Uhr schrieb Shiro Kawai <
> shiro.ka...@gmail.com>:
> >
> > Gauche has been mutexing realization of a promise, but srfi-226 is the
> right thing; evaluation of the body may communicate to another thread that
> may take the value of the promise.  Current Gauche deadlocks in that case.
> >
> > By the way, in the reference implementation, 'force' has this code:
> >
> >    (if (promise-done? p)
> >        ((promise-thunk p))
> >        (call-with-immediate-continuation-mark ....))
> >
> > And:
> >
> >    (promise-lock! p)
> >    ...
> >    (promise-done?-set! p (promise-done? q))
> >    (promise-thunk-set! p (promise-thunk q)))
> >    ...
> >    (promise-unlock! p)
> >
> > First I thought you need to lock promise to check promise-done? and
> retrieve promise-thunk, otherwise you may read the old value of
> promise-thunk and reevaluate  the body.  However, it is allowed that the
> body is evaluated multiple times, it's ok.  Am I understanding it right?
>
> The body is allowed to be evaluated multiple times (if a promise is
> concurrently forced). Still, the observed values of the forced promise
> should come from the same evaluation of the body.  So in the second
> part of the quoted code, the thunk should be set first and then the
> done? flag to eliminate the race condition.  (An atomic fence (see
> SRFI 230) may be needed by some implementations so that the observed
> mutation order is the same in all threads.)
>
> Do you see a new problem arising with reordering the two set!s?
>
> >
> >
> >
> >
> >
> >
> >
> >
> >
> >
> > On Sat, Mar 11, 2023 at 3:02 AM Marc Nieper-Wißkirchen <
> marc.nie...@gmail.com> wrote:
> >>
> >> Am Sa., 11. März 2023 um 11:11 Uhr schrieb Shiro Kawai <
> shiro.ka...@gmail.com>:
> >> >
> >> > From the srfi text, it is allowed that the delay's body to be
> evaluated by more than one thread simultaneously; only that the result of
> force is the result of the first delivered result.  Am I right?
> >>
> >> Indeed.  This is analogous to promises being forced while their "body"
> >> is evaluated, even in the same thread.
> >>
> >> >
>

Reply via email to