@Mikra, Depending on the compiler, _unspecified_ usually means asking for
trouble and lots of sleepless nights! lol
With the above code, I lose both signals, and always get a deadlock, even with
a single wait.
I believe this is because the signals happen 5000ms before the main thread
waits on the condition, and the signals are not saved.
If I reverse the roles of the threads, like the code below, everything works,
no deadlocks.
But, if I un-comment the second wait, I deadlock, the second signal is lost.
(Again, I expected this to happen.)
If I then place a sleep between the two signals in the following code, no
deadlock, no lost signals.
All of these results enforce my understanding that signals are never saved.
I don't have a windows box atm, but I will in a few days, and I will test it
there. Maybe Microsoft did weird stuff with their implementation of condition
variables?
import locks,os
# globals
var
thr: Thread[int] # don“t know if there is a untyped thread possible
cLock: Lock
lockCond: Cond
proc threadFunc (param : int) {.thread.} =
echo "start waiting"
withLock(cLock):
wait(lockCond,cLock)
#wait(lockCond,cLock)
# uncomment to check if there is a queue behind; on windows the (expected)
# behaviour is a deadlock for the second wait (second signal call is lost)
echo "end waiting"
initLock(cLock)
initCond(lockCond)
createThread(thr, threadFunc,0)
echo "mainthread:begin"
sleep(5000) # ensure that the signal of the childthread is called first
signal(lockCond) # first signal call
signal(lockCond) # if you signal twice the second signal is lost (no queue)
echo "mainthread: signal executed"
joinThreads(thr) # should not block if the childthread is already finished
deinitLock(cLock)
deinitCond(lockCond)
echo "end"