To pass multiple arguments to a thread you need to wrap them in a tuple: import std/locks var L: Lock var x = 0 proc threadFunc(a, b: int) {.thread.} = acquire(L) # lock stdout x.inc(a) echo b release(L) proc doIt() = initLock(L) var thr: array[0..4, Thread[int]] for i in 0..high(thr): createThread(thr[i], threadFunc, (i, i*i)) joinThreads(thr) deinitLock(L) doIt() echo x Run
That being said working on a global `seq[seq[T]]` sounds like it could be trouble. At least it used to be trouble pre-ARC, not sure if it is any longer.