我正在设计一种编程语言,目前正在考虑并发方面。我需要确定一致性模型,即在使用该语言编写的并发进程中如何处理数据。
有两个重要标准: - 我更喜欢易用性而不是性能,只要一致性模型允许良好的扩展。 - 我不能使用需要阻塞或动态内存分配的一致性模型。
我的两个候选者是非阻塞软件事务内存和没有共享的复制消息传递语义(类似于Erlang)。
我特别担心易用性,因此我将介绍我对这两种模型的主要反对意见。
在STM的情况下,用户必须理解哪些类成员必须原子地变异,并正确地界定原子代码段。这些必须编写得可以重复无限次,它们可能不执行任何I/O,也可能不调用某些外部函数等。我认为这对于一个非经验丰富的程序员来说远非易用。
Erlang风格的无共享并发很有吸引力,但是有一个问题:实时进程不能复制它们发送的对象,因为它们不能执行任何内存分配,所以对象必须通过队列从一个进程“移动”到另一个进程。用户必须意识到,如果一个实时进程对一个对象有两个引用,那么如果他将该对象发送到另一个进程,这两个引用都将被清除。这有点像弱指针,在使用的任何时候可能是null或非null:这可能会令人惊讶。
我倾向于第二种模型,因为它似乎更容易理解,并且自然地扩展到分布式系统。
你推荐什么?
- 非阻塞软件事务内存? - 具有实时约束困难的Erlang风格并发? - 我没有考虑过的其他东西?
有两个重要标准: - 我更喜欢易用性而不是性能,只要一致性模型允许良好的扩展。 - 我不能使用需要阻塞或动态内存分配的一致性模型。
我的两个候选者是非阻塞软件事务内存和没有共享的复制消息传递语义(类似于Erlang)。
我特别担心易用性,因此我将介绍我对这两种模型的主要反对意见。
在STM的情况下,用户必须理解哪些类成员必须原子地变异,并正确地界定原子代码段。这些必须编写得可以重复无限次,它们可能不执行任何I/O,也可能不调用某些外部函数等。我认为这对于一个非经验丰富的程序员来说远非易用。
Erlang风格的无共享并发很有吸引力,但是有一个问题:实时进程不能复制它们发送的对象,因为它们不能执行任何内存分配,所以对象必须通过队列从一个进程“移动”到另一个进程。用户必须意识到,如果一个实时进程对一个对象有两个引用,那么如果他将该对象发送到另一个进程,这两个引用都将被清除。这有点像弱指针,在使用的任何时候可能是null或非null:这可能会令人惊讶。
我倾向于第二种模型,因为它似乎更容易理解,并且自然地扩展到分布式系统。
你推荐什么?
- 非阻塞软件事务内存? - 具有实时约束困难的Erlang风格并发? - 我没有考虑过的其他东西?