哪些结构无法使用Ponylang的无锁模型?



Ponylang是一种无锁和无数据的新语言。我的印象是,为了实现这一点,Ponylang考虑了"如果两个线程可以看到同一个对象,那么write必须禁止其他线程的任何其他操作"这句话,并使用类型系统来强制执行各种特殊情况。例如,有一个类型描述符说,"没有其他线程可以看到这个对象",还有一个类型描述符说,"这个引用是只读的",等等。无可否认,我对此的理解相当贫乏,而且ponylang的文档缺少示例。

我的问题是:基于锁的语言是否有可能完全不能翻译成基于类型的系统的操作?此外,是否有这样的操作不能翻译成有效的结构?

[…在基于锁的语言中,是否存在根本不能翻译成基于类型的系统的操作?

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

同样,是否有这样的操作不能翻译成有效的结构?

如果你问基于锁的语言在某些情况下是否比pony更有效,那么我认为是的。你总是可以创建一个从N个线程和1个锁中受益的情况,而当你使用actor模型时,情况会更糟,因为它迫使你在消息中传递信息。 这并不是说演员模型在所有情况下都是优越的。这是一种不同的并发模型,解决问题的方法也不同。例如,要计算N个值并将结果累加到一个列表中:
  • 在线程模型中,您将
    1. 创建线程池
    2. 创建线程安全列表
    3. 创建N个任务共享列表,和
    4. 等待N个任务完成
  • 在角色模型中,您将
    1. 创建一个actor A等待N个值,
    2. 创建N个演员B共享演员A,和
    3. 等待A生成一个列表。

显然,每个任务都会向列表中添加一个值,每个参与者B会将该值发送给参与者a。这取决于参与者之间传递消息的方式,发送N个值可能比锁定N次要慢。通常情况下,它会慢一些,但另一方面,您永远不会得到一个具有意外大小的列表。

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

最新更新