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

时间:2015-06-08 07:21:21

标签: multithreading ponylang

Ponylang是一种无锁且无数据访问的新语言。我的印象是,要实现这一点,Ponylang会查看句子"如果两个线程可以看到同一个对象,那么写入必须禁止另一个线程的任何其他操作",并使用类型系统来强制执行各种特殊操作案例。例如,有一个类型描述符,表示"没有其他线程可以看到这个对象",并且有一个说,"这个引用是只读的#34;和其他各种。不可否认,我对此的理解非常差,而且ponylang的文档缺少示例。

我的问题是:是否可以使用基于锁定的语言进行操作,而这些语言根本无法转换为基于ponylang的基于类型的系统?此外,是否有这样的操作无法转换为ponylang中的高效结构?

2 个答案:

答案 0 :(得分:1)

  

[...]是否可以使用基于锁定的语言进行操作,而这些语言根本无法转换为基于ponylang的基于类型的系统?

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

  

此外,是否有这样的操作无法转换为ponylang中的高效构造?

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

这件事并不是说演员模型在所有情况下都是优越的。它是一种不同的并发模型,问题以不同的方式得到解决。例如,要计算N值并将结果累积在列表中:

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

显然,每个任务都会为列表添加一个值,每个actor B都会将值发送给actor A.根据actor之间传递消息的方式,发送N值比锁定N次要慢。通常它会慢一些,但另一方面,你永远不会得到一个意外大小的列表。

答案 1 :(得分:0)

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