模組提供 mprotector_init()、mprotector_fini()、mprotector_section_add() 三個 API。多任務在入口函式呼叫 mprotector_section_add(),但前提是 mprotector_init() 必須已執行且僅執行一次。
若放在任務入口,初始化順序與優先級變動會導致競爭;若在建立任務前集中呼叫,耦合度高且難維護。
將初始化責任內聚到 mprotector_section_add() 內部:
int mprotector_init() {
static bool initialized = false; // 唯一狀態旗標
if (initialized) return 0; // 重複呼叫直接返回
// ... 真正的初始化邏輯 ...
initialized = true;
return 0;
}
int mprotector_section_add(...) {
if (0 != mprotector_init()) return -1; // 確保初始化
// ... 正常業務邏輯 ...
}
static 區域變數初始化原子性(單執行緒環境下無鎖即安全)mprotector_init() 可重複呼叫無副作用std::call_once)「讓使用者專注於做什麼,而非何時準備好。」
隱式初始化是「慣例優於配置」在 C/C++ 底層 API 設計中的體現,能顯著降低介面複雜度與誤用機率。