Multithreading 生产者消费者使用分配

Multithreading 生产者消费者使用分配,multithreading,programming-languages,concurrency,functional-programming,Multithreading,Programming Languages,Concurrency,Functional Programming,我感兴趣的是,当存在多个产品和多个消费者时,是否可以在不使用赋值(即,使用函数式编程)的情况下解决生产者-消费者问题?怎么做 感谢我在SML中看到的所有producer-consumer实现都被迫依赖于refs(为了维护一个“休眠”项队列),所以我倾向于说“不”。拥有多个线程必然需要不纯净(非功能性)的操作。纯函数式编程将应用程序视为函数的评估。同时评估两个事物并在它们之间传递数据的概念在这个框架内是没有意义的 虽然可以并行计算函数的多个部分,如Haskell算子,但这与生产者-消费者问题不同

我感兴趣的是,当存在多个产品和多个消费者时,是否可以在不使用赋值(即,使用函数式编程)的情况下解决生产者-消费者问题?怎么做


感谢

我在SML中看到的所有producer-consumer实现都被迫依赖于
ref
s(为了维护一个“休眠”项队列),所以我倾向于说“不”。

拥有多个线程必然需要不纯净(非功能性)的操作。纯函数式编程将应用程序视为函数的评估。同时评估两个事物并在它们之间传递数据的概念在这个框架内是没有意义的


虽然可以并行计算函数的多个部分,如Haskell算子,但这与生产者-消费者问题不同,因此我认为你无法用函数的方式解决它。

解决这个问题的方法很多;每种方法都有不同的缺点

例如,“put”可以每次生成一个新线程。那样的话,你就根本不需要缓冲了。如果有很多请求进来,你就会产生很多线程,直到你的CPU忙于在线程之间切换而不是实际执行它们。但这只是将问题从代码转移到操作系统中:在某个特定点上,您必须始终同步对内存中变量的访问。操作系统必须维护线程列表,并且必须同步对此列表的访问

或者您想要限制线程的数量(那么“put”必须能够读取变量,而线程可能同时终止并减少它->再次同步访问)。或者,由于线程太多,您可能会面临资源耗尽的风险

您可以在调用“put”时发布消息,消费者可以收听消息。但这只是实现线程“等待”的一种复杂方式。你需要一种方法来确保只有一个消费者能得到信息。同样,您需要一些同步的数据结构


所以最终,问题不在于赋值,而在于对单个变量的并发访问。无论您如何尝试,对于任何Product consumer的实现,您都必须能够做到这一点(否则整个过程将是单线程的)。

是的,您可以通过消息传递很好地做到这一点。不要被系统的时代所拖累;约翰·雷皮的论文是这一主题的优秀指南。漂亮的东西

是的。查看函数式反应式编程(FRP),它与并发ML(Norman的建议)相关,但纯粹是函数式的。FRP的语义高度“并发”,同时具有简单、精确、确定的功能语义模型(时间函数)


编辑:我在这里引用了“并发”,因为我不是指通常的操作(面向实现)并发概念,它是必需的和不确定的,因此妨碍了实用和可靠的正确推理。

我没有看到问题中的多线程概念。请注意,纯功能抽象的实现可以使用并发。并发本身不需要显示语义/用户模型。此外,惰性函数编程非常类似于并发。许多暂停的计算(thunks)正在等待其他计算的需求(减少到弱水头标准形式),此时它们将暂时处于活动状态。尽管所有这些实现都是“并发”(协同程序风格),但语义是纯粹而简单的,因此允许进行易于处理的正确推理。