Julia 语言中有一个函数,可以并行地用随机值填充数组并计算其总和:
function thread_test(v)
Threads.@threads for i = 1:length(v)
@inbounds v[i] = rand()
end
sum(v)
end
@inbounds 是一个宏,它禁止检查数组外可能的索引,因为在这种情况下索引将始终位于其边界内。
为什么执行此代码时可能会出现竞争条件?
rand
在大多数语言中通常不是线程安全的,包括某些版本的 Julia。这意味着调用rand()
来自多个线程的可能会导致未定义的行为(实际上,种子通常由不同线程同时写入,从而降低随机数生成器的性能和随机性)。这朱莉娅文档 https://docs.julialang.org/en/v1/stdlib/Random/明确指出:
在多线程程序中,通常应该使用来自不同线程的不同 RNG 对象或任务以保证线程安全。但是,那从 Julia 1.3 开始,默认 RNG 是线程安全的(用一个每线程 RNG直至版本 1.6,以及此后的每个任务)。
除此之外,代码很好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)