18

Ponylang是一种无锁和无数据竞争的新语言。我的印象是,为了做到这一点,Ponylang 看这句话“如果两个线程可以看到同一个对象,那么 writes 必须禁止另一个线程的任何其他操作”,并使用类型系统来强制执行各种特殊情况。例如,有一个类型描述符说,“没有其他线程可以看到这个对象”,一个说,“这个引用是只读的”,以及其他各种。诚然,我对此的理解很差,而且 ponylang 的文档缺少示例。

我的问题是:基于锁的语言是否有可能根本无法翻译成 ponylang 的基于类型的系统的操作?此外,是否存在无法在 ponylang中转化为有效结构的操作?

4

2 回答 2

2

[...] 基于锁的语言是否存在根本无法翻译成 ponylang 的基于类型的系统的操作?

在 Pony 中,引用功能的全部意义在于防止您做其他语言中可能甚至微不足道的事情,例如在两个线程之间共享列表并同时向其中添加元素。所以,是的,在像 Java 这样的语言中,您可以在 Pony 中以一种不可能的方式在线程之间共享数据。

此外,是否存在无法在 ponylang 中转化为有效结构的操作?

如果你问基于锁的语言在某些情况下是否比小马更有效,那么我想是的。您总是可以创建一个受益于 N 个线程和 1 个锁的情况,并且当您使用强制您在消息中传递信息的参与者模型时更糟。

这并不是要在所有情况下都将actor模型视为优越的。这是一种不同的并发模型,问题的解决方式也不同。例如,要计算 N 个值并将结果累积到一个列表中:

  • 在线程模型中,您会
    1. 创建线程池,
    2. 创建线程安全列表,
    3. 创建 N 个任务共享列表,并且
    4. 等待 N 个任务完成。
  • 在演员模型中,您会
    1. 创建一个等待 N 个值的演员 A,
    2. 创建 N 个演员 B 共享演员 A,以及
    3. 等待 A 生成一个列表。

显然,每个任务都会向列表中添加一个值,每个参与者 B 会将值发送给参与者 A。根据参与者之间的消息传递方式,发送 N 个值可能比锁定 N 次要慢。通常它会更慢,但另一方面,您永远不会得到一个意外大小的列表。

于 2016-02-01T17:54:10.260 回答
0

我相信它可以做任何共享的一切+锁可以做的事情。只有iso对象,consume它基本上是一个纯粹的消息传递系统,可以做任何锁系统所做的事情。就像在 mach3 中一样,linux 可以做任何事情。

于 2016-01-28T06:47:55.063 回答