[m-users.] Threads and cc_multi-ness

Julien Fischer jfischer at opturion.com
Mon Feb 20 10:25:16 AEDT 2023



On Sun, 19 Feb 2023, Volker Wysk wrote:

> I've tried a trivial program using threads:
>
>
> :- pred main(io::di, io::uo) is cc_multi.
>
> ...
>
> main(!IO) :-
>    spawn(thread(88), !IO),
>    io.write_string("99\n", !IO).
>
> :- pred thread(int, io, io).
> :- mode thread(in, di, uo) is cc_multi.
>
> thread(I, !IO) :-
>    io.format("I=%i\n", [i(I)], !IO).
>
>
> Both main/2 and my thread/3 need to be cc_multi. What surprises me, is that
> I get a compiler warning:
>
>
> threads.m:021: In `thread'(in, di, uo):
> threads.m:021:   warning: determinism declaration could be tighter.
> threads.m:021:   Declared `cc_multi', inferred `det'.
>
>
> ... But the samples in samples/concurrency/dining_philosophers, which do it
> like my trivial program, get compiled without such a warning message.
>
> I think the warning isn't correct - the determinism declaration could NOT be
> tighter. The mode of the spawn/3 predicate forbids making it "det".

That warning is produced by determinism analysis and it doesn't "know"
that thread/3 will be used as an argument to spawn/3.

> So, what about this warning message? Just ignore?

Ignore it. There are a couple of ways to avoid it:

1. Declare thread/3 to be cc_multi and call builtin.cc_multi_equal/2 in
its body.

    thread(I, !IO) :-
        io.format("I=%i\n", [i(I)], !IO),
        cc_multi_equal(!IO).

2. Wrap the first argument of spawn/3 in a cc_multi closure.

     spawn((pred(!.IO::di, !:IO::uo) is cc_multi :- thread(88, !IO)), !IO),

Julien.


More information about the users mailing list