gpt4 book ai didi

ponylang - 数据竞赛?还是其他什么地方出了问题?

转载 作者:行者123 更新时间:2023-12-03 22:25:09 29 4
gpt4 key购买 nike

今天刚找到编程语言“小马”……并开始玩它。

我的代码应该做一些简单的生产者消费者的事情。
正如语言文档所声称的那样,该语言确保没有数据竞争。

这里,main 向生产者发送 10 条消息,生产者又向消费者发送 10 条消息。消费者增加一个计数器状态变量。然后,main 向消费者发送一条消息,消费者又向 main 发送一条消息以显示当前值。如果所有消息都按顺序排列,则预期值为 9(或 10)。打印的结果是 0。

由于这一切都发生在我使用语言的第 1 小时,当然我可能会搞砸其他事情。

谁能解释我的错误?

use "collections"

actor Consumer
var _received : I32
new create() =>
_received = 0
be tick() =>
_received = _received + 1
be query(main : Main) =>
main.status(_received)

actor Producer
var _consumer : Consumer
new create(consumer' : Consumer) =>
_consumer = consumer'

be produceOne () =>
_consumer.tick()

actor Main
var _env : Env
new create(env: Env) =>
_env = env
let c : Consumer = Consumer.create()
let p = Producer.create(c)
for i in Range[I32](0,10) do
p.produceOne()
end
c.query(this)

be status( count : I32) =>
// let fortyTwo : I32 = 42
// _env.out.print( "fortytwo? " + (fortyTwo.string()))
_env.out.print( "produced: " + (count.string()) )

在 Windows 10 上运行,64 位,顺便说一句。使用我找到的最新最好的 zip 文件安装。

0.10.0-1c33065 [release] compiled with: llvm 3.9.0 -- ?

最佳答案

Pony 阻止的数据竞争发生在内存级别,当有人从内存位置读取而其他人正在写入时。这是通过禁止与类型系统共享可变状态来防止的。

但是,如果结果取决于 Pony 不保证的消息排序,您的程序仍然可能有“逻辑”数据竞争。 Pony 保证消息的因果顺序。这意味着,如果消息具有相同的目的地,则发送或接收的消息是将要发送或接收的任何 future 消息的原因,当然原因必须先于其结果发生。

actor A
be ma(b: B, c: C) =>
b.mb()
c.mc(b)

actor B
be mb() =>
None

actor C
be mc(b: B) =>
b.mb()

在本例中, B将始终收到来自 A 的消息在来自 C 的消息之前因为 A发送消息到 B在向 C 发送消息之前(请注意,这两条消息仍然可以按任何顺序接收,因为它们没有相同的目的地)。这意味着消息发送到 B来自 C消息发送到 B后发送来自 A由于两者都有相同的目的地,因此存在因果关系。

让我们看看程序中的因果顺序。与 ->是“是原因”,我们有
  • Main.create -> Main.status (通过 Consumer.query)
  • Consumer.create -> Consumer.query
  • Consumer.create -> Consumer.tick (通过 Producer.produceOne)
  • Producer.create -> Producer.produceOne

  • 如您所见, Consumer.query 之间没有因果关系。和 Consumer.tick .在实际实现的意义上,这意味着 Main可以发 produceOne消息,然后发送 query在任何之前的消息 Producer开始执行它收到的消息并有机会发送 tick信息。如果您使用一个调度程序线程( --ponythreads=1 作为命令行参数)运行您的程序,它将始终打印 produced: 0因为 Main将独占唯一的调度程序直到 create 结束.对于多个调度程序线程,0 到 10 之间的任何事情都可能发生,因为所有调度程序都可能忙于执行其他参与者,或者可以开始执行 Producer s 立即。

    总之,您的 tickquery行为可以按任何特定顺序执行。要解决此问题,您必须在消息之间引入因果关系,方法是添加往返消息或在同一个参与者中进行累积和打印。

    关于ponylang - 数据竞赛?还是其他什么地方出了问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820906/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com