Mutex 的大小

Wu Yu Wei published on
2 min, 355 words

以下討論的鎖全以 x86_64-linux-gnu 目標為準

一個簡單的 futex 在 Linux 上是 4 bytes 而已,不過 pthread_mutex_t 為了支援一些額外的功能,所以最後是 40 bytes。這些功能包含像是 reentrance 和 robust 等等。一個 robust mutex 會在擁有該鎖的執行緒死亡時自動釋放,讓其他執行緒在必要時能清理殘骸。不過這些 flag 預設都是關閉的。

同樣地,在 glibc 中 pthread_cond_t48 bytes,也提供了不少額外功能像是防止錯誤的喚醒、儲存 flag 紀錄哪些核心在用且是否有被共享。但是在 Boost 的 condition_variable 又多存了一個 mutex,所以加總其來是 88 bytes,這個額外的 mutex 是用來支援執行緒的取消與中斷。因為 pthread_cond_wait 會在回傳前重新鎖住 mutex,這樣在 mutex 是鎖住時是無法中斷的,所以 Boost 改在每個條件變數(condvar) 都加一個 mutex 來等待。

而不像 pthread_rwlock_t,Boost 的 shared_mutex 能夠將 reader 升級成 writer。該實作是用一個 40 bytes 的 mutex 保護一個 4 bytes 的狀態,並用到了三個 88 bytes 的條件變數:一個給 reader、一個給 writer、一個給升級用。最後加上 padding 就是 312 bytes

最後 Rust 的 Mutex 本質上就只是 Box<pthread_mutex_t>,一樣是 40 bytes,不過會被分配到 heap 上。