我是多线程世界的新手,我只是想写一个比较(大)排序2D数组的函数:
function check_duplicates(sites, generated_structures)
for i in eachindex(generated_structures)
sites == generated_structures[i] && return false
end
return true
end
"generated_structures"可能很大(5M+元素),为了加快速度,我正在考虑这样做:
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,因为它们检查的子部分不包含匹配项。
一种方法是设置一个公共状态标志,每个线程都可以访问该标志,如果其他线程找到了匹配的状态标志,则退出该标志。要以线程安全的方式完成此操作,有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
包装器仍然有效,但相当慢一点。
我从上面的代码中得到了一个不错的线程加速,但是线程开销相当大,所以如果你的匹配是在记录的早期,线程版本将会慢得多。
一个开销更低的多线程库是聚酯。如果比赛来得早,速度会快得多。但是,它与Threads库不兼容,因此不能在Threads中嵌套它。