I am trying to learn how the new --gc:arc works with threads, is popping off the q seq correct in a consumer thread? It appears to work, because I lock everything, but I don't know if it will cause problems in some way. Am I missing some thing?
import locks, os
var
qLock: Lock
consumers: array[0 .. 9, Thread[void]]
var q: seq[int]
initLock(qLock)
for i in 0 ..< 20:
echo "produce: ", i
q.add(i)
proc consumer() {.thread.} =
while true:
acquire(qLock)
{.gcsafe.}:
if q.len == 0:
echo "exit"
release(qLock)
return
var i = q.pop()
echo "consume: ", i
release(qLock)
sleep(1000) # do some work every second
for i in 0 ..< 10:
createThread(consumers[i], consumer)
joinThreads(consumers)
Thank you!
Is true if instead of passing integers I pass ref objects? This appears to work:
# Producer consumer with regular nim threads:
import locks, os
var
qLock: Lock
consumers: array[0 .. 9, Thread[void]]
type RefObject = ref object
name: string
next: RefObject
var q: seq[RefObject]
initLock(qLock)
for i in 0 ..< 20:
echo "produce: ", i
q.add(RefObject(name: "name" & $i))
proc consumer() {.thread.} =
while true:
acquire(qLock)
var refObject: RefObject
{.gcsafe.}:
if q.len == 0:
echo "exit"
release(qLock)
return
refObject = q.pop()
release(qLock)
refObject.next = RefObject()
sleep(100) # do some work every second
echo "consume: ", refObject.name
for i in 0 ..< 10:
createThread(consumers[i], consumer)
joinThreads(consumers)