當 aligment
為 2 的 n 次方時 if ((alignment & mask) == 0)
會成立,sz + mask
會得到大於 alignment
的數值,再將 sz + mask
跟 ~mask
做 &
後即可將最低的 n - 1 bit 清零,達到 align_up 的效果
linux/arch/s390/boot/startup.c
的 setup_kernel_memory_layout
函式中使用相同的技巧來將 pages
向上對齊到 PAGES_PER_SECTION
qsort_mt
初始化並建立執行緒來執行 qsort_thread
qsort_thread
若 qs
的狀態為 ts_idle
代表沒有任務需要處理,呼叫 pthread_cond_wait
等待,直到其他執行緒呼叫 pthread_cond_signal
,被喚醒後解鎖防止 spurious wakeup 的 mutex,並執行 qsort
在所有執行緒都為 idle 時,將所有的 thread 設為 terminate,並回傳,若沒有則繼續回到 again
等待新的工作
執行 $ clang qsort_mt.c -fsanitize=thread -fPIE -pie -g
SUMMARY: ThreadSanitizer: data race qsort_mt.c:211:27 in allocate_thread
原本實作為 allocate_thread
中第七行,將 c->pool[i]
的狀態改為 ts_work
再 lock 該執行緒的鎖
但在更改 c->pool[i]
的狀態時,qsort_thread
中的 while loop 判斷中讀取到的狀態資訊可能會有 data race
修改成取得鎖之後再修改執行緒的狀態