Add a value to task local storage if it is not already present

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
1 Like