我不能使用boost或最新的std ::线程库。 要走的路是创build一个有限范围的互斥体的自定义实现。
简单地说,当一个类实例是创build一个互斥锁的时候。 在课程破坏时,互斥锁被解锁。
任何可用的实现? 我不想重新发明轮子。
我需要使用pthreads。
注意这是一个旧的答案。 C ++ 11包含更好的与平台无关的助手:
- 的std :: lock_guard
- std :: mutex , std :: timed_mutex , std :: recursive_mutex , std :: recursive_timed_mutex
和其他选项,如std :: unique_lock,boost :: 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
,你可以防止子类化。 由于引用字段,复制/分配已被禁止
编辑 pthreads:
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; };