2011-11-02 79 views
10

我不能使用boost或最新的std ::線程庫。要走的路是創建範圍互斥體的自定義實現。自定義RAII C++實現範圍互斥鎖

簡而言之,當一個類實例創建一個互斥鎖時。在課程破壞時,互斥鎖被解鎖。

有沒有可用的實現?我不想重新發明輪子。

我需要使用pthreads。

  • 資源獲取就是初始化==「RAII」

回答

13

注意這是一個古老的答案。 C++ 11包含更好的幫手獨立於平臺的更多:

和其他選項比如std :: unique_lock,提振:: unique_lock

任何RAII教程都可以。

這裏的要點是:(也http://ideone.com/kkB86

// stub mutex_t: implement this for your operating system 
struct mutex_t 
{ 
    void Acquire() {} 
    void Release() {} 
}; 

struct LockGuard 
{ 
    LockGuard(mutex_t& mutex) : _ref(mutex) 
    { 
     _ref.Acquire(); // TODO operating system specific 
    }; 

    ~LockGuard() 
    { 
      _ref.Release(); // TODO operating system specific 
    } 
    private: 
    LockGuard(const LockGuard&); // or use c++0x ` = delete` 

    mutex_t& _ref; 
}; 

int main() 
{ 
    mutex_t mtx; 

    { 
     LockGuard lock(mtx); 
     // LockGuard copy(lock); // ERROR: constructor private 
     // lock = LockGuard(mtx);// ERROR: no default assignment operator 
    } 

} 

當然,你可以把它朝mutex_t通用的,可以防止子類。 複製/分配已經禁止的,因爲參考場

編輯對於並行線程的:

struct mutex_t 
{ 
    public: 
     mutex_t(pthread_mutex_t &lock) : m_mutex(lock) {} 

     void Acquire() { pthread_mutex_lock(&m_mutex); } 
     void Release() { pthread_mutex_unlock(&m_mutex); } 
    private: 
     pthread_mutex_t& m_mutex; 
}; 
+0

我更新了我的問題,要求並行線程。爲此,您的_ref.Acquire()將是pthread_mutex_lock(_ref)? – cateof

+1

嗯。爲線程庫實現的部分被標記爲這樣。無論如何,我爲pthread_mutex_t添加了一個快速實現以供參考。 – sehe

+0

甚至在我指定操作系統詳細信息之前,您已經得到了答案:-) – cateof