isLocked方法用于haswell RTM

时间:2013-12-29 13:52:35

标签: c++ transactions parallel-processing

我目前正在使用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所示,大部分时间都没用)。你有什么建议吗?

谢谢!

2 个答案:

答案 0 :(得分: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();
}

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

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

答案 1 :(得分:0)

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

a)对于自旋锁:

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

b)对于互斥:

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