适用于C或Java的非玩具软件事务内存

时间:2013-02-25 09:50:53

标签: java c transactions shared-memory

我正在考虑通过1或2个实验室教授使用软件交易记忆进行大学课程的可能性。我只知道Haskell的STM,但该课程的学生可能从未听说过。

我已在网上或其他问题中找到了一些此类库的列表(例如http://en.wikipedia.org/wiki/Software_transactional_memory#C.2FC.2B.2B)。当你读到这篇文章的时候我正在检查它们,但是其中很多都没有一个非常好的文档(大多数是研究原型,只是在论文中含糊不清地描述,我宁愿教一些更常用的文档)。 此外,维基百科提供的许多链接都是悬空的。

总结一下,STM的实施是针对工业项目(或至少是非玩具项目,以确保一定的质量水平)并且有充分的文件证明(给出一些好的指示学生们)?

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

3 个答案:

答案 0 :(得分:5)

生产质量STM-Library不是一种教学工具,甚至不是“最佳实践”。任何大学/大学课程值得学习的可能是 1%的代码;剩余的99%是基于平台的内在角落案例。有趣的1%不会以任何方式突出显示,因此您无法找到它。

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

首先介绍问题:并发,缓存......

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

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

答案 1 :(得分:3)

  

首先介绍问题:并发,缓存......

eznme引导,我在concurrency大学期间遇到的一些好问题。

  • Dining philosophers problem
      

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

         

    dining phil

使用来自here的相同实现,Je M​​agee和Je Kramer,并使用监视器解决问题。

大多数共享内存应用程序使用Integers比使用字符串更高效(由于Java的AtomicInteger类)。因此,在我看来,展示shared memory的最佳方法是让学生编写一个使用threadpool计算素数的应用程序,或计算一些integral

线程和共享内存的一个很好的例子是Producer-consumer problem

  

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

     

producer http://cse.csusb.edu/tong/courses/cs460/images/producer-consumer.gif

实施工作here,还有Massey来自软件英语教授Jenz Dietrich的实施。

对于分布式算法MapReduceHadoop是高度记录的分布式数据结构。对于分布式编程库,请查看MPI (Message Passing Interface)OpenMP(或Pragma for C ++)。 Dijkstra shortest path algorithm中也有parallel的实现。

答案 2 :(得分:1)

今天有三种方法可以做STM。

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

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

第二种方法是使用Java。您可以使用DeuceSTM,它非常容易扩展(类型安全使TM实现更容易!),或者使用Scala的Akka库用于STM。我更喜欢Deuce,因为它更容易扩展和更容易使用(你只需将方法注释为@Atomic,而Deuce的java代理会完成剩下的工作)。

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