Newbie questions about Pliant

Newbie questions about Pliant

multitask

thread, parallel, ...
Message posted by johan.boule on 2001/01/26 23:08:32
UNDER WINDOWS
=============

Test 1
======
submodule "/pliant/language/unsafe.pli"
# do nothing

output at debug level 2
=======================
Attempted to destroy a locked semaphore
Message posted by johan.boule on 2001/01/26 23:10:05
UNDER WINDOWS
=============

Test 2
======
submodule "/pliant/language/unsafe.pli"
gvar FastSem s
thread
  s request
  for (gvar Int i) 0 1000
    console i eol
  s release
s request # to wait for the thread to terminate
s release

output at debug level 2
=======================
0
1
2
[...]
59
60
61
62 object(s) have not been freed because of at most 1070 lost link(s).
63224 byte(s) have not been freed
63
64
[...]
71
72

-----------------------------------------
173
74
75
[...]
81
82
 object(s) with type ErrorID
48 object(s) with type 83
84
85
[...]
91
92Str
12 object(s) with type Int
-----------------------------------------
93
94
95
96
[crash of the whole console]
Message posted by johan.boule on 2001/01/26 23:15:11
It seems that the console meta isn't thread safe (the output of the errors accesses the console in concurrency with my thread)
Message posted by hubert.tonneau on 2001/01/27 00:34:48
Your program is completely buggy, because the main thread might
(and actually do) get and release the lock before the new one requires
it, so the main thread starts the exit code, which is freeing memory,
while the new thread is running. Very bad indead.

This one would work:

module "/pliant/language/unsafe.pli"
gvar FastSem s
s request
thread
  for (gvar Int i) 0 1000
    console i eol
  s release
s request # to wait for the thread to terminate
s release

Also, when run at debugging level 2, it shows that I have garbadge
problem, which might be solved by Patrice latest remarks.

You should try to use 'parallel' higher level instruction when you want
post synchronization:

module "/pliant/language/unsafe.pli"
parallel threads 1
  task
    for (gvar Int i) 0 1000
      console i eol

It is granted that the main thread will wait for the extra threads to end
before leaving the 'parallel' instruction.
Here, we have only one thread to start, so 'parallel' is a bit overskilled,
but it's really powerfull.
See module /pliant/util/crypto/rsa.pli to have another example of
'parallel' instruction.