1

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

推荐的流程如下:

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() 函数。到目前为止,我还没有找到任何提供此功能的主流库/类(如这里所见,大多数情况下它是无用的)。你有什么建议?

谢谢!

4

2 回答 2

1

Andi Kleen 在这里建议使用pthread_mutex_trylock(有一些保留)。
还有几张幻灯片提到在这里使用 lock_is_locked() 。第一个链接声称由于特殊的硬件适配,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();
}

共享 var 用作穷人锁,当然对它的写入和读取不受自身保护,但由于它位于关键部分中,它会提供您想要的确切语义(仅在 RTM 尝试的原子部分中读取,写在后备原子部分)。

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

于 2013-12-29T15:35:09.337 回答
0

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

a) 对于自旋锁:

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

b) 对于互斥锁:

if (pthread_mutex_t.__data.__lock != 0) _xabort ();
于 2014-05-05T07:43:07.567 回答