- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
今天刚找到编程语言“小马”……并开始玩它。
我的代码应该做一些简单的生产者消费者的事情。
正如语言文档所声称的那样,该语言确保没有数据竞争。
这里,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()) )
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 立即。
tick
和
query
行为可以按任何特定顺序执行。要解决此问题,您必须在消息之间引入因果关系,方法是添加往返消息或在同一个参与者中进行累积和打印。
关于ponylang - 数据竞赛?还是其他什么地方出了问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820906/
为什么赋值返回以前的值而不是新值,例如:将 0 赋值给 y 而不是 2?这是非常危险的,因为它违反了最小意外原则。 var x: I32 = 0 let y = (x = 2) 最佳答案 我很确定这样
从 helloworld 开始,我试图通过制作一个应用程序来学习一些小马,该应用程序会向用户回显他们输入的内容。这是有效的,除了我 _env.out.print(_buffer) 的一行。 class
今天刚找到编程语言“小马”……并开始玩它。 我的代码应该做一些简单的生产者消费者的事情。 正如语言文档所声称的那样,该语言确保没有数据竞争。 这里,main 向生产者发送 10 条消息,生产者又向消费
我正在尝试学习 Pony,出于显而易见的原因,我想做的第一件事就是打印值。 但是,它似乎不适用于大多数事情,例如: env.out.print(2 + 2) 给出错误: Could not infer
Pony 有一个未参数化的异常值。 不幸的是,我经常有一些代码想要抛出不同类型的异常,并且我需要知道它们是什么,以便正确处理它们——例如,简单地说,当停止程序时,向用户提供以下信息很重要正确的错误消息
actor Test fun foo(a: U32) => a = a + 1 我想要test.foo(a)修改a。这可能吗?谢谢 最佳答案 您只能在类级别修改var。这是故
我一直在尝试从 Pony Language 的 FFI 调用 Window 的 CreateProcessA。 我创建了一个 C 和一个 PonyLang 示例。 C 示例非常有效: #include
我一直在研究 Pony 数组,以便更好地理解 Pony,并且想为任何数组编写映射函数。 我说的是现在大多数语言都具有的用于转换集合元素的标准映射函数,如 Clojure 中所示: (map #(+ 1
我是一名优秀的程序员,十分优秀!