我是多线程领域的新手,我只想编写一个比较(大)排序二维数组的函数:
function check_duplicates(sites, generated_structures)
for i in eachindex(generated_structures)
sites == generated_structures[i] && return false
end
return true
end
“generated_structures”可能很大(超过 500 万个元素),为了加快速度,我正在考虑做这样的事情:
function check_duplicates(sites, generated_structures)
Threads.@threads for i in eachindex(generated_structures)
sites == generated_structures[i] && return false
end
return true
end
以便多个线程检查大数组的子部分。是否有可能一旦满足条件,函数就会停止并返回 false?现在一些线程返回 true,因为他们检查的子部分不包含匹配项。
最佳答案
一种方法是拥有一个公共(public)状态标志,每个线程都可以访问该标志,并在其他线程找到匹配项时退出。要以线程安全的方式执行此操作,有 Threads.Atomic
:
function hasdup(val, itr)
status = Threads.Atomic{Bool}(false)
Threads.@threads for x in itr
status[] && break
(x == val) && (status[] = true)
end
return status[]
end
现在,我不太确定为什么对 status
的访问需要是线程安全的,因为它只会被写入以便将其设置为 true
。删除 Atomic
包装器仍然有效,但速度要慢得多。
我从上面的代码中获得了不错的线程加速,但是线程开销相当大,所以如果你的比赛在记录的早期,线程版本会慢得多。
一个开销低得多的多线程库是 Polyester.jl,如果匹配得早,它会快得多。但是,它与 Threads 库不兼容,因此您不能将它嵌套在 Threads 中。
关于multithreading - Julia 多线程 "broadcast return",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74366173/