Julia 线程中循环线程中的变量是本地变量吗?

Jks*_*Liu 5 multithreading julia

Threads.@threads for i in [sth]
    x = 123
    ...
end
Run Code Online (Sandbox Code Playgroud)

线程是x本地的。我找不到任何有关它的文件。
如果没有,我怎样才能获得本地线程。

Bog*_*ski 4

假设这x是循环内的局部,那么是的。这是一个如何检查它的示例:

# julia -t 2 --banner=no
julia> Threads.@threads for i in 1:8
           x = i
           @info Threads.threadid(), i, x
           sleep(rand())
           @info Threads.threadid(), i, x
       end
[ Info: (1, 1, 1)
[ Info: (2, 5, 5)
[ Info: (1, 1, 1)
[ Info: (1, 2, 2)
[ Info: (2, 5, 5)
[ Info: (2, 6, 6)
[ Info: (1, 2, 2)
[ Info: (1, 3, 3)
[ Info: (2, 6, 6)
[ Info: (1, 3, 3)
[ Info: (1, 4, 4)
[ Info: (2, 7, 7)
[ Info: (1, 4, 4)
[ Info: (2, 7, 7)
[ Info: (2, 8, 8)
[ Info: (2, 8, 8)
Run Code Online (Sandbox Code Playgroud)

对于每个线程,在循环体内传递的任何for带有注释的内容Threads.@threads都包装在匿名函数中。您可以使用@macroexpand函数来检查它。

请注意,它甚至更多x:在循环的每次迭代中获取一个新的绑定(这是 Julia 的标准行为——无论是单线程代码还是多线程代码,请参见此处)。

如果x不是循环内的局部变量,for则不再成立,如您在此处看到的:

# julia -t 2 --banner=no
julia> function f()
       x = 1
       Threads.@threads for i in 1:8
           x = i
           @info Threads.threadid(), i, x
           sleep(rand())
           @info Threads.threadid(), i, x
       end
       end
f (generic function with 1 method)

julia> f()
[ Info: (1, 1, 5)
[ Info: (2, 5, 5)
[ Info: (1, 1, 5)
[ Info: (1, 2, 2)
[ Info: (2, 5, 2)
[ Info: (2, 6, 6)
[ Info: (2, 6, 6)
[ Info: (2, 7, 7)
[ Info: (1, 2, 7)
[ Info: (1, 3, 3)
[ Info: (1, 3, 3)
[ Info: (1, 4, 4)
[ Info: (2, 7, 4)
[ Info: (2, 8, 8)
[ Info: (2, 8, 8)
[ Info: (1, 4, 8)
Run Code Online (Sandbox Code Playgroud)