【问题标题】:isLocked method for use in haswell RTMhaswell RTM 中使用的 isLocked 方法
【发布时间】:2013-12-29 13:52:35
【问题描述】:

我目前正在使用 Intel Haswell RTM(硬件支持事务内存)开发应用程序。从我看到的herehere 来看,推荐的过程是使用某种回退锁,以防事务中止。

推荐的流程如下:

someTypeOfLock fallback_lock;
if(_xbegin == _XBEGIN_STARTED) {
    if(fallback_lock.isLocked()) // put the lock into the transaction read_set
        _xabort();
    // do stuff
    _xend();
}
else{
    fallback_lock.acquire();
    // do stuff
    fallback_lock.release();
}

我的问题是关于 isLocked() 函数。到目前为止,我还没有找到任何提供此功能的主流库/类(如here 所见,大多数情况下它是无用的)。你有什么建议吗?

谢谢!

【问题讨论】:

    标签: c++ parallel-processing transactions intel-tsx


    【解决方案1】:

    Andi Kleen 在这里建议 using pthread_mutex_trylock(有一些保留)。
    还有一些幻灯片提到使用 lock_is_locked() here。 第一个链接声称由于特殊的硬件适配,trylock 将在 RTM 中取得成功,我不完全确定这种机制将如何工作,所以我不确定我是否可以推荐。

    相反,我认为我个人会选择一种更直接的方法来使用任何共享变量,方法是将其设置在后备锁保护的原子部分中,并读取它而不是 try_lock。像这样 -

    someTypeOfLock fallback_lock;
    if(_xbegin == _XBEGIN_STARTED) {
        if(shared_var) // put the lock into the transaction read_set
            _xabort();
        // do stuff
        _xend();
    }
    else{
        fallback_lock.acquire();
        shared_var = true;
        // do stuff
        shared_var = false;
        fallback_lock.release();
    }
    

    shared var 用作穷人锁,当然对其进行读写并不受其自身保护,但由于它位于临界区中,因此它将提供您想要的确切语义(仅在 RTM-attempted原子部分,写在备用原子部分中)。

    当然 - 如果您可以直接以非侵入方式查询锁本身会更简单,但这取决于锁库。

    【讨论】:

    • 如果我使用了pthread_mutex_trylock,并且锁还没有被锁定,看来我是在写它,不是吗?因此中止所有并行事务?另外,您能否详细说明为什么仅读取共享变量的效率/安全性较低?这似乎是完美的解决方案,因为我对此变量的值不感兴趣,而只是在发生冲突时中止事务?
    • @user3143937 - 查看我的编辑。我没有任何特别的理由反对使用共享变量,这就是我建议它的原因。一般来说,我更喜欢使用库函数而不是手动破解,但你说得对,我们不应该完全相信无法解释的方法。
    【解决方案2】:

    您想要做的是“读取”锁但没有锁定。为此,您需要仔细研究您正在使用的锁的库。您可以在下面看到如何解决互斥锁或自旋锁的问题:

    a)对于自旋锁:

    if ((int)spin_lock != 1) _xabort();
    

    b)对于互斥锁:

    if (pthread_mutex_t.__data.__lock != 0) _xabort ();
    

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多