某些CPU上std :: atomic <T>的存储顺序

时间:2019-12-19 16:39:26

标签: c++ multithreading std cpu-cache

使用std :: atomic,您可以进行原子增量,进行compare-exchange等等。如果比较交换成功和不成功,则可以选择为内存排序提供一个值,也可以提供两个值,一个为成功,一个为不成功的比较和交换。有了这个你可以加快释放仅在操作成功后才需要释放行为的互斥体。

但是我想知道的是:哪种CPU架构通过ISA支持这样的区别?

1 个答案:

答案 0 :(得分:1)

  

通过此操作,您可以加快释放仅需要的互斥量   如果操作成功,将释放行为。

互斥锁释放失败如何?

释放未锁定的互斥锁是编程错误。

纯释放操作几乎从来不会在有条件的情况下完成,而获取操作则是在有条件的情况下进行。引用计数可能是一个例外。

  

但是我想知道的是:哪种CPU架构支持   通过ISA来区分?

所有您将无条件地在比较并设置之后插入围栏指令的地方。

再次引用计数(这可能是互斥量实现之外的RMW操作的最常见用法):

  • 只有计数达到0的情况很明显
  • 仅在保持所有者不变的情况下,“计数”才需要“可靠”
  • RC实现了相互排斥,即拥有合法的引用并看到计数达到0

基本上RC就像是RW锁:

  • 根据定义,W锁与所有R锁同步
  • W-lock优先
  • 当有一个线程在等待W锁时,每个R -unlock尝试进行W锁定。

在这种情况下,您将R解锁(因此释放),并且如果W锁处于挂起状态,并且没有其他R锁处于活动状态的W锁(重新)。 (是的,我知道这样的类比是没有意义的,因为您不会在进行R解锁的同一线程中进行W锁定,而是进行其他操作。)

在这种情况下,您需要W锁的后挡板。

因此,通常,任何在负载上不隐式获取的弱排序CPU。

这对于诸如RC和RW锁之类的原语很重要,您可以在其中尝试将最后一个R锁转换为W锁(尝试升级锁)。