有没有人尝试过C ++的事务性内存?

时间:2008-09-17 12:20:09

标签: c++ multithreading locking intel transactional-memory

我正在检查英特尔的“whatif”网站及其事务性内存编译器(每个线程必须进行原子提交或回滚系统的内存,就像数据库那样)。

这似乎是一种替代锁和互斥锁的有前途的方法,但我找不到很多推荐。这里有人有任何意见吗?

5 个答案:

答案 0 :(得分:8)

我没有使用英特尔的编译器,但Herb Sutter对此有一些有趣的评论......

来自Sutter Speaks: The Future of Concurrency

您是否对交易记忆有很多兴趣和使用,或者大多数开发人员难以理解这个概念?

目前还不能回答谁在使用它,因为它还没有上市。英特尔有一个软件事务内存编译器原型。但如果问题是“开发人员难以使用吗?”答案是我当然希望不会。重点是它比锁更容易。这是研究领域唯一的主要内容,它希望大大减少我们对锁的使用。它永远不会完全取代锁,但是我们唯一的希望是部分更换锁。

有一些限制。特别是,某些I / O本质上不是事务性的 - 您不能使用提示用户输入其名称的原子块并从控制台读取名称,如果它与另一个事务冲突,则自动中止并重试该块;如果你提示他两次,用户可以分辨出差异。事务性内存非常适合仅触及内存的内容。

我所知道的每个主要硬件和软件供应商都在R& D中拥有多个交易记忆工具。有关于基本问题的理论答案的会议和学术论文。我们还没有进入Model T阶段,我们可以将它发布出去。您可能会看到早期的,有限的原型,您无法进行无限制的事务内存 - 您只能读取和写入100个内存位置。但是,这对于启用更多无锁算法仍然非常有用。

答案 1 :(得分:4)

博士。 Dobb去年有一篇关于这个概念的文章:Calum Grant的交易编程 - http://www.ddj.com/cpp/202802978

它包含一些使用他的示例库的例子,比较和结论。

答案 2 :(得分:3)

我在一些函数式编程思想的基础上构建了组合STM库。它不需要任何编译器支持(除了它使用C ++ 17),并没有带来新的语法。通常,它采用Haskell的STM library接口。

所以,我的库有几个不错的属性:

  • Monadically组合。每个事务都是名为STML的自定义monad中的计算。您可以将monadic事务组合成更大的monadic事务。
  • 事务与数据模型分开。您可以使用事务变量(TVars)构建并发数据模型,并在其上运行事务。
  • retry个组合子。它允许您重新运行该事务。建立简短易懂的交易非常有用。
  • 不久有不同的monadic组合器来表达计算。
  • Context。每个计算都应该在某个上下文中运行,而不是在全局运行时中运行。因此,如果需要多个独立的STM集群,则可以有许多不同的上下文。
  • 概念上的实施非常简单。至少,Haskell中的the reference implementation是如此,但由于缺乏对函数式编程的良好支持,我不得不重新发明几种C ++实现方法。

即使我们认为它是实验性的,该库也显示出非常好的稳定性和稳健性。此外,我的方法通过性能,功能,全面性等方式为改进库提供了很多可能性。

为了展示其工作,我解决了Dining Philosophers任务。您可以在下面的链接中找到代码。样品交易:

STML<bool> takeFork(const TVar<Fork>& tFork)
{
    STML<bool> alreadyTaken = withTVar(tFork, isForkTaken);
    STML<Unit> takenByUs    = modifyTVar(tFork, setForkTaken);
    STML<bool> success      = sequence(takenByUs, pure(true));
    STML<bool> fail         = pure(false);
    STML<bool> result       = ifThenElse(alreadyTaken, fail, success);
    return result;
};

<强>更新 我已经写了一个教程,你可以找到它here

答案 3 :(得分:1)

太阳微系统公司宣布他们将于明年发布代号为Rock的新处理器,该处理器具有对事务内存的硬件支持。它会有一些局限性,但这是一个很好的第一步,它应该使程序员更容易用事务替换锁/互斥量来获得良好的性能。

关于这个主题的一个有趣的话题,由Sun研究交易记忆和摇滚的研究人员之一Mark Moir提供,请查看link

有关一般情况下Sun关于Rock和Transactional Memory的更多信息和公告,请link

强制性wikipedia entry:)

最后,威斯康星大学麦迪逊分校的this link包含了有关交易记忆的大部分研究的参考书目,无论是硬件相关还是软件相关。

答案 4 :(得分:-1)

在某些情况下,我认为这是有用的,甚至是必要的。

但是,即使处理器具有使此过程更容易的特殊指令,与互斥锁或信号量相比仍然存在很大的开销。根据它的实现方式,它也可能影响实时性能(必须停止中断,或阻止它们写入共享区域)。

我的期望是,如果实现了这一点,那么只需要给定内存空间的某些部分,因此影响可能会受到限制。

- 亚当