朱莉娅多线程"broadcast return"



我是多线程世界的新手,我只是想写一个比较(大)排序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中嵌套它。

最新更新