版權所有 © 2014 tutorialspoint
futex - 快速使用者空間鎖定系統呼叫
#include <linux/futex.h> #include <sys/time.h> int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);
#include <linux/futex.h>
#include <sys/time.h>
int futex(int *uaddr, int op, int val, const struct timespec * timeout , int *uaddr2, int val3);
futex() 系統呼叫提供了一種方法,允許程式等待給定地址的值發生變化,以及喚醒等待特定地址的任何程序的方法(雖然不同程序中相同記憶體的地址可能不相等,但核心會在內部對映它們,因此在不同位置對映的相同記憶體對於futex() 呼叫將對應)。正如futex(7)中所述,它通常用於實現共享記憶體中鎖的競爭情況。
當futex(7)操作未在使用者空間無競爭地完成時,需要呼叫核心進行仲裁。仲裁可以意味著使呼叫程序休眠,或者相反,喚醒等待程序。
此函式的呼叫者應遵守futex(7)中規定的語義。由於這些語義涉及編寫非行動式彙編指令,這反過來可能意味著大多數使用者實際上是庫作者,而不是一般的應用程式開發人員。
uaddr 引數需要指向一個儲存計數器的對齊整數。要執行的操作透過op 引數傳遞,以及一個值val。
目前定義了五個操作
對於futex(7),如果遞減計數得到負值(表示競爭),則執行此呼叫,並將休眠直到另一個程序釋放 futex 並執行 FUTEX_WAKE 操作。
對於futex(7),如果遞增計數顯示有等待者,則在 futex 值設定為 1(表示可用)後執行此操作。
為了防止競爭條件,呼叫者應該在 FUTEX_FD 返回後測試 futex 是否已增加。
根據執行的操作,返回值可能具有不同的含義。
需要重申的是,裸 futex 並非旨在作為面向終端使用者的易於使用的抽象。預期實現者精通匯編語言,並閱讀過下面引用的 futex 使用者空間庫的原始碼。
最初的 futex 支援合併到 Linux 2.5.7 中,但語義與上述描述不同。具有此處給定語義的 4 引數系統呼叫是在 Linux 2.5.40 中引入的。在 Linux 2.5.70 中添加了一個引數。在 Linux 2.6.7 中添加了第六個引數——混亂,尤其是在 s390 架構上。
此係統呼叫是 Minux 特定的。
廣告