生产者 - 消费者使用作业

时间:2009-08-05 18:30:40

标签: multithreading programming-languages concurrency functional-programming

我有兴趣找到生产者 - 消费者问题,当有多个产品和多个消费者在没有使用分配的情况下解决,即使用功能样式的编程?怎么样?

Producer-consumer problem

由于

5 个答案:

答案 0 :(得分:3)

拥有多个线程必然需要不纯(非功能)操作。纯函数式编程认为您的应用程序是对函数的评估。同时评估两个并在它们之间传递数据的概念在此框架中没有意义。

虽然可以并行评估函数的多个部分,如Haskell的``par运算符,但这与生产者 - 消费者问题不同,因此我不认为你能够以功能的方式解决它。

答案 1 :(得分:3)

是的,你可以在Concurrent ML传递消息时做得很好。不要被系统时代推迟; John Reppy的book和论文是该主题的优秀指南。美丽的东西!

答案 2 :(得分:3)

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

编辑:我在这里引用了“并发”,因为我意味着通常的操作(面向实现)并发概念,这是必要的和非确定性的从而阻碍了实践和可靠的正确推理。

答案 3 :(得分:1)

我在SML中看到的生产者 - 消费者的所有实现都被迫依赖ref s(为了保持“睡眠”项目的队列),所以我倾向于说“否”。

答案 4 :(得分:1)

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

例如,“put”每次都可以生成一个新线程。这样,你根本不需要缓冲区。如果有大量请求进入,则会产生大量线程,直到CPU更忙于切换线程而不是实际执行它们为止。但这只是将问题从您的代码转移到操作系统中:在某个时刻,您始终必须同步访问内存中的变量。操作系统必须维护一个线程列表,并且必须同步对该列表的访问。

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

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

所以最后,它不是真正的分配,这是问题,而是对单个变量的并发访问,无论你如何尝试,对于生产 - 消费者的任何实现,你必须能够做到这一点(或者整个将是单线程的。)

相关问题