10
我不能使用boost或最新的std ::線程庫。要走的路是創建範圍互斥體的自定義實現。自定義RAII C++實現範圍互斥鎖
簡而言之,當一個類實例創建一個互斥鎖時。在課程破壞時,互斥鎖被解鎖。
有沒有可用的實現?我不想重新發明輪子。
我需要使用pthreads。
- 資源獲取就是初始化==「RAII」
我不能使用boost或最新的std ::線程庫。要走的路是創建範圍互斥體的自定義實現。自定義RAII C++實現範圍互斥鎖
簡而言之,當一個類實例創建一個互斥鎖時。在課程破壞時,互斥鎖被解鎖。
有沒有可用的實現?我不想重新發明輪子。
我需要使用pthreads。
注意這是一個古老的答案。 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;
};
我更新了我的問題,要求並行線程。爲此,您的_ref.Acquire()將是pthread_mutex_lock(_ref)? – cateof
嗯。爲線程庫實現的部分被標記爲這樣。無論如何,我爲pthread_mutex_t添加了一個快速實現以供參考。 – sehe
甚至在我指定操作系統詳細信息之前,您已經得到了答案:-) – cateof