何时可以通过使用内存障碍来避免锁?就像在这种情况下一样:Consumer-Producer-Wiki(最后一种实现是使用内存屏障,并且所有休息都使用锁或信号量。)锁VS内存障碍
在锁之类的情况下使用内存屏障是否更好?如果是,为什么?
使用内存障碍可以避免锁的最常见情况是什么?
何时可以通过使用内存障碍来避免锁?就像在这种情况下一样:Consumer-Producer-Wiki(最后一种实现是使用内存屏障,并且所有休息都使用锁或信号量。)锁VS内存障碍
在锁之类的情况下使用内存屏障是否更好?如果是,为什么?
使用内存障碍可以避免锁的最常见情况是什么?
根据定义,互斥体需要执行内存屏障。如果一个互斥体没有包含内存屏障,那么对它提供的独占访问数据的操作可能会在关键区域之外重新排序。
另外,互斥体实现通常需要执行内存屏障本身,否则互斥体本身可能会重新排序。
换句话说,互斥体的实现包含一个内存屏障,以便执行强制互斥所必需的原子锁定,但即使不需要,互斥体也会包含内存屏障,否则它不会“非常有用。
结论:如果你不想让你的代码破坏,即使在需要内存屏障的地方也可以使用锁定。
inline void mb_()
{
mutex_t mtx;
mutex_init(&mtx);
mutex_lock(&mtx);
mutex_unlock(&mtx);
}
如果您要瞄准性能,您可能需要先进的技术。
锁是多一点的开销而不仅仅是使用记忆障碍? – adisticated
互斥量内部调用mem_fence类的指令,而这种类型的代码块开销很小。任何线程都会在锁上等待的机会很小。 – v78
你已经知道了答案,如果内存屏障总是会更好,那么在锁定原语中就没有任何意义。谷歌“活锁和饥饿”来学习更多。 –
@Hans Passant需要了解使用内存屏障的场景。你可以点亮这个吗? – adisticated
是@Hans,在任何情况下锁都不能避免。这就是为什么复杂的问题摆在首位。我想他想知道可以避免不必要锁定的情况。 – v78