分类: LINUX
2013-04-23 10:48:57
总结就是,futex现在已经由内核完全支持,用户多线程应用程序基本可以不用考虑这个问题,除非有特殊需求。
[1]
futex(快速用户区互斥的简称)是一个在Linux上实现锁定和构建高级抽象锁如信号量和POSIX互斥的基本工具。
它们第一次出现在内核开发的2.5.7版;其语义在2.5.40固定下来,然后在2.6.x系列稳定版内核中出现。
Futex 是由Hubertus Franke(IBM Thomas J. Watson 研究中心), Matthew Kirkwood,Ingo Molnar(Red Hat)
和 Rusty Russell(IBM Linux 技术中心)等人创建的。
Futex 由一块能够被多个进程共享的内存空间(一个对齐后的整型变量)组成;这个整型变量的值能够通过汇编语言调用
CPU提供的原子操作指令来增加或减少,并且一个进程可以等待直到那个值变成正数。Futex 的操作几乎全部在应用程序空间
完成;只有当操作结果不一致从而需要仲裁时,才需要进入操作系统内核空间执行。这种机制允许使用 futex 的锁定原语
有非常高的执行效率:由于绝大多数的操作并不需要在多个进程之间进行仲裁,所以绝大多数操作都可以在应用程序空间
执行,而不需要使用(相对高代价的)内核系统调用。
http://blog.csdn.net/Javadino/archive/2008/09/06/2891399.aspx
futex 的逻辑可以用如下C语言表示
int val = 0;
void lock()
{
int c
if ((c = cmpxchg(val, 0, 1)) != 0) {
if (c != 2)
c = xchg(val, 2);
while (c != 0) {
futex_wait((&val, 2);
c = xchg(val, 2);
}
}
}
void unlock()
{
if (atomic_dec(val) != 1)
futex_wake(&val, 1);
}
val 0: unlock
val 1: lock, no waiters
val2 : lock , one or more waiters
参见: futex are tricky