互斥量是多線程同步最基礎的鎖原語。本文系統整理 pthread_mutex_t 相關 5 個核心函數的原型、參數、返回值、行為語義與使用陷阱,為後續同步實戰打基礎。
int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* attr);
mutex:輸出參數,指向互斥量對象。attr:屬性對象,NULL 使用默認屬性(類型 DEFAULT、非進程共享、非健壯)。ENOMEM、EINVAL 等)。pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 僅適用默認屬性。int pthread_mutex_destroy(pthread_mutex_t* mutex);
EBUSY)。init。int pthread_mutex_lock(pthread_mutex_t* mutex);
EDEADLK,RECURSIVE 類型允許遞歸(需配對 unlock)。int pthread_mutex_trylock(pthread_mutex_t* mutex);
EBUSY,不阻塞。int pthread_mutex_unlock(pthread_mutex_t* mutex);
EPERM)。lock 同次數的 unlock 才真正釋放。pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); // 開發期推薦 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); // 需遞歸時 pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT); // 實時系統優先級繼承 pthread_mutex_init(&mutex, &attr); pthread_mutexattr_destroy(&attr);
unlock → 永久阻塞其他線程。unlock → 數據結構損壞。lock → 隱蔽死鎖,極難復現。互斥量 5 大 API 構成「初始化→加鎖/解鎖→銷毀」生命周期。理解 lock 阻塞語義、trylock 非阻塞語義、鎖類型對重複加鎖行為的影響,是編寫正確多線程代碼的前提。開發階段強烈建議使用 ERRORCHECK 類型自動檢測誤用。