这个多线程功能怎么实现呢

核心1上不停计算x 核心2上不停取x的值
但没调试通 x没有共享 程序一直在核心1上循环 请大神指点 谢谢

using Distributed
using SharedArrays
x = SharedArray{Float64}(1, 1) #创建共享数组
addprocs(4)
@async (
fetch(
@spawnat 1  begin 
     
    while true
        x[1] = x[1] + 5.0  #核心1上计算
      # println("aaaa")
        sleep(1)
    end
end
)
)

@async (
fetch(
@spawnat 2 begin    
    while true
      if (mod(fetch(x[1]),20.0)==0.0) #取核心1的计算结果
        println(fetch(x[1]))
      end 
      sleep(1)
    end
end
)
)

你的代码只要改一处就能运行:先加进程再创建共享数组。你先建立数组再加进程怎么可能让 x 跑到还不存在的进程上。

这里指出其他问题:

  1. 你的代码是在用多进程而不是多线程
  2. 你把每个进程的创建放到了一个协程里,我不清楚你是否有特殊理由,但通常是多此一举。多进程是真并行,协程是假并行,根据需要二选一就行

我给出一个可用代码:

using Distributed
using SharedArrays

addprocs(1) #此例子中加一个就够了

x = SharedArray{Float64}(1) #创建共享数组

p1 = @spawnat 1  begin 
     
    while true
        x[1] = x[1] + 5.0  #核心1上计算
      # println("aaaa")
        sleep(1)
    end
end

p2 = @spawnat 2 begin    
    while true
      #shared array 没有必要用fetch
      if (mod(x[1],20.0)==0.0) #取核心1的计算结果
        println(x[1])
      end 
      sleep(1)
    end
end


wait(p1) #阻塞,防止退出

谢谢大神 :pray: 研究一 下你的代码

果然成功了 大神牛x :+1: :+1: :+1: 我折腾了一下午啊 :joy:

另外,此处 shared array 不是最合适的(万一两个进程时间不够同步就乱了,sleep只能保证自己所在的句子的时间),应该用 remote channel。

请大神再具体指点。。。。。 我也在想sleep的问题 初学 实在不懂