范围互斥锁的自定义RAII c++实现
custom RAII C++ implementation for scoped mutex locks
我不能使用boost或最新的std::线程库。方法是创建一个作用域互斥锁的自定义实现。
简单地说,当一个类实例被创建一个互斥锁。在类销毁时,互斥锁被解锁。
有可用的实现吗?我不想重新发明轮子。
我需要使用pthreads。
- 资源获取初始化== " RAII "
注释这是一个旧的答案。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
泛型,你可以防止子类化。由于引用字段
EDIT For 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;
};
相关文章:
- 具有瞬态资源的RAII类
- 使用RAII在给定次数的迭代后重新分配资源
- 在文件夹迭代上实现 RAII
- 在 RAII 构造中修改 RVO 值是否安全?
- RAII 等效于 FIFO 发布订单
- 当无法进行RAII时,如何在C++中"try/finally"?
- 如何处理 RAII 中的资源等待
- c++重载=运算符,RAII
- 如何使用 RAII 包装返回错误代码的 C 分配
- 使用 RAII 替换最终块以释放内存
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- 返回持有 std::mutex 锁的 RAII 容器类
- 继承、后台线程和 RAII
- 将 C 包装在 RAII 中而不公开类型
- 避免在构造函数中分配或保持简单性(和 RAII?
- 避免 RAII 计时器对象中的虚假构造和破坏
- Raii vs.垃圾收集器
- 为什么这个 RAII cout 重定向器不起作用:
- RAII获取在破坏过程中捕获的错误的方法
- 是聪明的指针是RAII的好习惯