12

我正在考虑通过 1 或 2 个指导实验室为大学课程教授软件事务内存使用的可能性。我只知道 Haskell 的 STM,但该课程的学生可能从未听说过它。

我已经在网上或其他问题中找到了一些此类库的列表(例如,http ://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B )。当您阅读本文时,我正在检查它们,但其中许多似乎没有很好的文档(大多数是研究原型,只是在论文中模糊地描述,我宁愿教一些更有用和有据可查的东西)。此外,维基百科提供的许多链接都是悬空的。

总而言之,是否有针对工业项目(或至少是非玩具项目,以确保一定的质量水平)和有据可查(为学生提供一些好的指导)的 STM 实现?

编辑:我不是这门课的老师,我只是帮他做实验室。当然,学生们之前将学习并发和分布式算法的基础知识。这只是在课程结束时提出一些不同的想法。

4

3 回答 3

5

生产质量的 STM 库并非旨在作为教学工具,甚至不是“最佳实践”。对于任何大学/大学课程来说,值得学习的可能是1%的代码;剩下的 99% 是与平台相关的本质角落案例。有趣的 1% 没有以任何方式突出显示,因此您无法找到它。

我对大学/大学课程(无论是入门课程还是高级课程)的建议是自己实施 STM 构建块(并且仅适用于 1 个平台)。

首先介绍问题:并发、缓存……

然后介绍我们有的原子助手:cas/cmpxchg,fence。

然后与您的学生一起构建示例,首先简单,然后更难,更复杂。

于 2013-02-25T10:38:28.873 回答
3

首先介绍问题:并发、缓存……

eznme 开始,我在大学期间解决了一些很好的问题concurrency

  • 餐饮哲学家问题

    在计算机科学中,哲学家进餐问题是并发算法设计中经常使用的示例问题,用于说明同步问题和解决这些问题的技术。

    餐饮菲尔
    (来源:wikimedia.org

使用 Je Magee 和 Je Kramer的相同实现,并使用监视器解决问题。

大多数共享内存应用程序Integers比字符串更有效(由于AtomicIntegerJava 的类)。所以shared memory在我看来,最好的演示方法是让学生编写一个应用程序,使用 athreadpool来计算素数,或者计算一些integral.

或者线程和共享内存的一个很好的例子是生产者-消费者问题

生产者-消费者问题(也称为有界缓冲区问题)是多进程同步问题的经典示例。

制片人
(来源:csusb.edu

实现在这里找到,还有来自软件工程师 Jenz Dietrich教授的Massey的实现。

对于分布式算法, MapReduceHadoop是高度记录的分布式数据结构。对于分布式编程库,请查看MPI(消息传递接口)OpenMP(或C++ 的Pragma)。也有并行的Dijkstra 最短路径算法的实现。

于 2013-02-25T10:43:48.160 回答
1

今天有三种做STM的好方法。

第一种方法是使用 gcc 并在 C 或 C++ 中进行 TM。从 gcc 4.7 开始,通过 -fgnu-tm 标志支持事务内存。gcc 维护者做了大量工作,从 4.9(主干)分支开始,您甚至可以使用硬件 TM(例如,Intel Haswell TSX)。在http://justingottschlich.com/tm-specification-for-cv-1-1/上有一个 TM 接口的规范草案,这不是太痛苦。您还可以从 TM 社区中找到 gcc 的 TM 用例(例如,参见 transact 2014 中的应用程序跟踪论文:http: //transact2014.cse.lehigh.edu)。

实现本身有点复杂,但这就是正确的。有很多关于可能出错的文献,尤其是在 C 或 C++ 等类型不安全的语言中。GCC 把所有这些事情都做对了。真的。

第二种方式是使用Java。你可以使用 DeuceSTM,它很容易扩展(类型安全使得 TM 实现更容易!),或者使用 Scala 的 STM 的 Akka 库。我更喜欢 Deuce,因为它更易于扩展且更易于使用(您只需将方法注释为 @Atomic,其余的由 Deuce 的 java 代理完成)。

第三种方法是使用 Scala。我在这个领域做的不多,但研究人员似乎喜欢 Akka。如果您隶属于并行/分布式类,您甚至可能已经在使用 Scala。

于 2013-09-04T01:32:16.813 回答