首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >isLocked方法在haswell RTM中的应用

isLocked方法在haswell RTM中的应用
EN

Stack Overflow用户
提问于 2013-12-29 13:52:35
回答 2查看 218关注 0票数 1

我目前正在开发一个使用Intel Haswell RTM (用于事务内存的硬件支持)的应用程序。根据我所看到的这里这里,推荐的过程是使用某种类型的回退锁,以防事务中止。

建议的流程如下:

代码语言:javascript
复制
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()函数。直到现在,我还没有找到任何主流的库/类来提供这种功能(正如这里所看到的,这种功能在大多数情况下都是无用的)。你有什么建议吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-29 15:35:09

安迪·克莱恩( Andi )在这里建议使用 pthread_mutex_trylock (有一些保留意见)。

还有一些幻灯片提到了对lock_is_locked() 这里的使用。第一个链接声称由于特殊的HW适应,trylock将在RTM中成功,我不完全确定这个机制是如何工作的,所以我不确定我是否能推荐它。

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-05-05 07:43:07

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

(A) spinlock:

代码语言:javascript
复制
if ((int)spin_lock != 1) _xabort();

(B)互斥:

代码语言:javascript
复制
if (pthread_mutex_t.__data.__lock != 0) _xabort ();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20825802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档