Many programming languages, such as Clojure, Scala, and Haskell, support different concurrency models.In practice these models are often combined, however the semantics of the combinations are not always well-defined.In this paper, we study the combination of futures and Software Transactional Memory.Currently, futures created within a transaction cannot access the transactional state safely, violating the serializability of the transactions and leading to undesired behavior.We define transactional tasks: a construct that allows futures to be created in transactions.Transactional tasks allow the parallelism in a transaction to be exploited, while providing safe access to the state of their encapsulating transaction.We show that transactional tasks have several useful properties: they are coordinated, they maintain serializability, and they do not introduce non-determinism.As such, transactional tasks combine futures and Software Transactional Memory, allowing the potential parallelism of a program to be fully exploited, while preserving the properties of the separate models where possible.
展开▼