Could you have an array of workspaces?
workspaces = [create_workspace() for _ in 1:Threads.nthreads()]
function compute(workspaces, config)
workspace = workspaces[Threads.threadid()]
#... Do some compute
end
As long as you use something like Threads.@threads you shouldn’t ever overlap.
You could also use a Channel:
# setup workspaces channel
workspaces = Channel{YourWorkspaceType}(Threads.nthreads())
for i in 1:nthreads()
put!(workspaces, create_workspace())
end
function compute(workspaces, config)
workspace = take!(workspaces)
#... Do some compute
put!(workspaces, workspace)
end