如何解决LUA:多线程查找素数的问题
我正在使用lua查找给定范围内的所有素数。它的工作方式是从开始到最大的数字进行迭代,然后将当前数字除以每个数字(从1到该数字)。如果只有2个除数,则将其添加到列表中。目前,它会同时跳过偶数以加快处理速度。
为了进一步加快该过程,我转向lua库effil。在非常善良的开发人员的帮助下,我设法将其安装并正常工作。我创建了一个effil表,以允许多个线程之间进行数据通信并最后返回所有素数。我在新的effil线程上调用该函数,然后在主线程上再次调用该函数,以将处理负载分配给它们,然后将effil表转换为常规表并打印出每个值。
但是,我遇到了函数无法正确找到素数的问题。它应该从第一个数字开始,检查一下,然后跳4个数字,例如1,5,9。然后为另一个线程提供一个偏移量,以便它填充之间的数字,例如3,7,11。
此方法返回一个无序列表(我打算以后再排序),但是其中有重复的数字,例如数字3将出现两次。
我无法弄清楚算法的哪一部分导致了此问题。感谢您的帮助
编辑:如果我在effil线程上添加了一个等待(因此程序等待该线程结束,然后在主线程上运行该函数),它将显示范围内正确的素数。因此,跨线程交谈似乎是一个问题。
effil = require("effil")
io.write("Starting value: ")
first = tonumber(io.read())
io.write("Ending value: ")
last = tonumber(io.read())
-- create thread-safe table
primes = effil.table()
start_time = os.clock()
function find_primes(start,final,offset,tab)
-- change start if it's even
if start%2==0 then
start = start + 1
end
-- iterate from start to end on every fourth number
for x=start+offset,4 do
local temp = {}
for i=1,x,2 do
if x%i==0 then
table.insert(temp,i)
end
end
-- check if only has 2 divisors
if #temp == 2 then
tab[#tab+1] = x
end
end
end
-- run on main thread and effil thread
effil.thread(find_primes)(first,last,primes)
find_primes(first,2,primes)
-- convert back to normal table and print
final = effil.dump(primes)
for x=1,#final do
print(final[x])
end
-- print stats
print("Numbers: "..#final)
print("Time: "..os.clock()-start_time.." secs")
io.write("Press ENTER to close")
io.read()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。