JuliaFolds2 / OhMyThreads.jl

Simple multithreading in julia
https://juliafolds2.github.io/OhMyThreads.jl/
MIT License
139 stars 9 forks source link

`@only_one` doesn't reset within function #102

Closed carstenbauer closed 7 months ago

carstenbauer commented 7 months ago

Works:

julia> using OhMyThreads

julia> @tasks for i in 1:8
           @set ntasks = 2

           println(i, ": before")
           @only_one begin
               println(i, ": after")
           end
       end
5: before
1: before
5: after
2: before
3: before
6: before
6: after
7: before
7: after
8: before
4: before
8: after

julia> @tasks for i in 1:8
           @set ntasks = 2

           println(i, ": before")
           @only_one begin
               println(i, ": after")
           end
       end
1: before
5: before
1: after
6: before
2: before
7: before
8: before
2: after
3: before
3: after
4: before
4: after

Doesn't work:

julia> function f()
           @tasks for i in 1:8
               @set ntasks = 2

               println(i, ": before")
               @only_one begin
                   println(i, ": after")
               end
           end
       end
f (generic function with 1 method)

julia> f()
1: before
1: after
2: before
5: before
2: after
3: before
3: after
4: before
4: after
6: before
7: before
8: before

julia> f()
1: before
5: before
6: before
7: before
2: before
3: before
4: before
8: before
carstenbauer commented 7 months ago

Functional analog is working fine:

julia> using OhMyThreads

julia> using OhMyThreads.Tools: OnlyOneRegion, try_enter!

julia> function g()
           r = OnlyOneRegion()
           tforeach(1:8; ntasks=2) do _
               println("A")
               try_enter!(r) do
                   println("B")
               end
           end
       end
g (generic function with 1 method)

julia> g()
A
A
B
A
B
A
A
A
A
B
A
B

julia> g()
A
A
B
A
A
B
A
B
A
A
B
A