Can you read global data from a thread in Nim? Yes you can, but currently you have to use pointers to do so. This is due to the way memory access from threads is protected by the compiler (with the default garbage-collection).
Here is an example:
import locks
import tables
var
threads: array[4, Thread[void]]
lock: Lock
globalData = {"1": "one"}.toTable
globalPtr = addr(globalData)
proc threadFunc() {.thread.} =
acquire(lock) # lock stdout
let data = cast[ptr Table[string,string]](globalPtr)[]
echo data["1"]
release(lock)
initLock(lock)
for i in 0..high(threads):
createThread(threads[i], threadFunc)
joinThreads(threads)
You can build this code with:
nim c -d:debug --threads:on pointers.nim
This was tested with Nim v1.2.
This code was adapted from a threading example in the Nim docs.
Leave a comment