首页 / 更多教程 / muduo 库解析之六:Mutex
muduo 库解析之六:Mutex
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了muduo 库解析之六:Mutex,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2114字,纯文字阅读大概需要4分钟。
内容图文
源码
#pragma once
#include <pthread.h>
#include "NonCopyable.h"
#include "CurrentThread.h"
namespace muduo
{
//@ 检查返回值的宏
#ifdef CHECK_PTHREAD_RETURN_VALUE
#ifdef NDEBUG
__BEGIN_DECLS
extern void __assert_perror_fail(int errno, const char *file, unsigned int line, const char *function) noexcept __attribute__((__noreturn__));
__END_DECLS
#define MCHECK(ret) ({ __typeof__(ret) errno = (ret); if (__builtin_expect(errno != 0, 0)) __assert_perror_fail(errno, __FILE__, __LINE__, __func__); })
#endif
#else //@ CHECK_PTHREAD_RETURN_VALUE
#define MCHECK(ret) ({ __typeof__(ret) errno = (ret); assert(errno == 0); void(errno); })
#endif //@ CHECK_PTHREAD_RETURN_VALUE
class MutexLock : public NonCopyable
{
public:
MutexLock() : holder_(0)
{
MCHECK(pthread_mutex_init(&mutex_, nullptr));
}
~MutexLock()
{
assert(holder_ == 0); //@ 保证锁不被持有
MCHECK(pthread_mutex_destroy(&mutex_));
}
bool is_locked_by_this_thread() const
{
return holder_ == CurrentThread::tid();
}
void assert_locked() const
{
assert(is_locked_by_this_thread());
}
void lock()
{
MCHECK(pthread_mutex_lock(&mutex_));
assign_holder();
}
void unlock()
{
unassign_holder();
MCHECK(pthread_mutex_unlock(&mutex_));
}
pthread_mutex *get_mutex() const
{
return &mutex_;
}
private:
void assign_holder()
{
holder_ = CurrentThread::tid();
}
void unassign_holder()
{
holder_ = 0;
}
private:
class UnassignGuard : NonCopyable
{
public:
explicit UnassignGuard(MutexLock &owner) : owner_(owner)
{
owner_.unassign_holder();
}
~UnassignGuard()
{
owner_.assign_holder();
}
private:
MutexLock &owner_; //@ 存放引用
};
private:
pthread_mutex mutex_;
pid_t holder_;
};
//@ RAII 格式 MutexLock 使用
class MutexLockGuard : public NonCopyable
{
public:
explicit MutexLockGuard(MutexLock &mutex) : mutex_(mutex)
{
mutex_.lock();
}
~MutexLockGuard()
{
mutex_.unlock();
}
private:
MutexLock &mutex_;
};
//@ 避免构造一个临时的对象,例如 MutexLockGuard(mutex),临时对象不能一直持有锁
#define MutexLockGuard(x) error "Missing guard object name"
}
内容总结
以上是互联网集市为您收集整理的muduo 库解析之六:Mutex全部内容,希望文章能够帮你解决muduo 库解析之六:Mutex所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。