一段时间以来,我一直对唯一性类型感兴趣,以替代纯函数式语言中的monad。不幸的是,这是CS研究的一个深奥领域,有关具有唯一性类型的编程的在线资源非常少。
显而易见,如何将唯一性类型用于实现状态数据结构,例如引用(“框”)和数组,尽管这使我无法理解如何使用它们来实现其他常见的状态数据结构。
例如,可以实现唯一类型的锁定吗?可以使用唯一性类型在线程之间共享可变数据吗?是否可以使用唯一类型来构建同步原语(例如互斥体),或者是否需要传递消息?
一段时间以来,我一直对唯一性类型感兴趣,以替代纯函数式语言中的monad。不幸的是,这是CS研究的一个深奥领域,有关具有唯一性类型的编程的在线资源非常少。
显而易见,如何将唯一性类型用于实现状态数据结构,例如引用(“框”)和数组,尽管这使我无法理解如何使用它们来实现其他常见的状态数据结构。
例如,可以实现唯一类型的锁定吗?可以使用唯一性类型在线程之间共享可变数据吗?是否可以使用唯一类型来构建同步原语(例如互斥体),或者是否需要传递消息?
Answers:
例如,可以实现唯一类型的锁定吗?
我按照罗伯特·哈维(Robert Harvey)提供的链接进行了快速阅读。我不能说我什么都明白了,或者我有高度信心,我真的明白了我想我明白,但在我看来,外部唯一性和参考不变性的整点是有没有必要锁定。
现代多线程方法试图避免锁定,因为只有经验丰富的程序员才能编写使用锁定的代码,甚至他们的代码也很容易出现错误。如果您还添加了一个事实,那就是锁定代码实际上是不可测试的,那么很明显,这是一种非常不受欢迎的处理方式,并且旨在使我们摆脱锁定状态的任何解决方案至少可以说是有希望的。
我们一直在避免锁定的方法是通过消息传递,这要求消息必须是不可变的。大致上,(乍一看)引用不变性似乎是一种可以帮助我们保证不变性而不必实际构造不可变类型的技术,而外部唯一性似乎是一种可以帮助我们在本地放松严格的不变性要求的技术。
可以使用唯一性类型在线程之间共享可变数据吗?
该论文没有明确说明,但据我了解,一个外部唯一的对象簇是线程安全的,因为以某种方式(真的,如何?)可以确保该对象簇中仅存在一个外部引用,这意味着接收到此类引用的线程可以将引用的对象视为可变对象,而不必担心其他线程也可能对其进行突变,因为其他线程不可能拥有另一个引用。我很想知道如何实现和执行这种理论构造。
是否可以使用唯一类型来构建同步原语(例如互斥体),或者是否需要传递消息?
再次,据我了解,外部唯一类型和引用不变性意味着不必提供锁,互斥对象等。消息传递似乎是解决之道,这很好。