首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 多線程互斥鎖 從原理到跨平台封裝實現

     編輯:C++ 入門

C++ 多線程互斥鎖:從原理到跨平台封裝實現

互斥量 是內核對象,保證線程對共享資源的互斥訪問。與關鍵區 對比:Mutex 可跨進程同步、支援超時等待,但訪問速度較慢(需陷入內核)。本文解析 Mutex 核心結構,並展示一個跨平台(Windows/Linux)的 C++ 封裝庫實現。

Mutex 核心機制

  • 使用計數/遞歸計數器:記錄同一線程重複鎖定次數,避免死鎖。
  • 線程 ID:標識當前擁有者。
  • 等待隊列:阻塞等待的線程隊列。

典型應用:保護多線程共享內存塊,防止數據競爭導致破損。

跨平台封裝設計

核心類 OSTMutex 統一接口,內部使用平台原生同步原語:

  • Windows:CRITICAL_SECTION(用戶態,高性能)+ InitializeCriticalSectionAndSpinCount 優化自旋。
  • POSIX:pthread_mutex_t 屬性設置為 PTHREAD_MUTEX_RECURSIVE 支援遞歸鎖定。

核心代碼實現

頭文件 OSTMutex.h

#if (OST_PLATFORM == OST_PLATFORM_WIN32)
typedef CRITICAL_SECTION OST_MUTEX_SECTION;
#else
#include <pthread.h>
typedef pthread_mutex_t OST_MUTEX_SECTION;
#endif

class OSTMutex : public NonCopyable {
public:
    OSTMutex(); ~OSTMutex();
    void Lock() const;                    // 阻塞鎖定
    void Unlock() const;                  // 解鎖
    OSTBool TryLock();                    // 非阻塞嘗試
    OSTBool TryLock(long milliseconds);   // 超時嘗試
private:
    mutable OST_MUTEX_SECTION m_mutex;
};

// RAII 鎖管理器
class AutoLock {
public:
    AutoLock(const OSTMutex& m, OSTBool autoLock = OST_TRUE) : m_mutex(m), m_locked(autoLock) {
        if (autoLock) m_mutex.Lock();
    }
    ~AutoLock() { if (m_locked) m_mutex.Unlock(); }
private:
    const OSTMutex& m_mutex; OSTBool m_locked;
};
#define LOCK(mutex) AutoLock locker(mutex)  // 便捷宏

Windows 實現 OSTMutex_Win32.cpp

OSTMutex::OSTMutex() { InitializeCriticalSectionAndSpinCount(&m_mutex, 4000); }
OSTMutex::~OSTMutex() { DeleteCriticalSection(&m_mutex); }
void OSTMutex::Lock() const { EnterCriticalSection(&m_mutex); }
void OSTMutex::Unlock() const { LeaveCriticalSection(&m_mutex); }
OSTBool OSTMutex::TryLock() { return TryEnterCriticalSection(&m_mutex) ? OST_TRUE : OST_FALSE; }
OSTBool OSTMutex::TryLock(long ms) { return OST_TRUE; /* 簡化實現 */ }

POSIX 實現 OSTMutex_POSIX.cpp

OSTMutex::OSTMutex() {
    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
    pthread_mutex_init(&m_mutex, &attr);
    pthread_mutexattr_destroy(&attr);
}
OSTMutex::~OSTMutex() { pthread_mutex_destroy(&m_mutex); }
void OSTMutex::Lock() const { pthread_mutex_lock(&m_mutex); }
void OSTMutex::Unlock() const { pthread_mutex_unlock(&m_mutex); }
OSTBool OSTMutex::TryLock() {
    int rc = pthread_mutex_trylock(&m_mutex);
    return (rc == 0) ? OST_TRUE : (rc == EBUSY ? OST_FALSE : throw SystemExc("Cannot lock"));
}

工程實踐要點

  1. RAII 模式:AutoLock 確保異常安全,離開作用域自動解鎖。
  2. 遞歸鎖:同一線程多次 Lock 不死鎖,需對應次數 Unlock。
  3. 非拷貝:繼承 NonCopyable 禁止拷貝構造/賦值,避免鎖對象複製導致未定義行為。
  4. 超時鎖:POSIX 可用 pthread_mutex_timedlock,Windows 需循環 TryLock+Sleep 實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved