zoukankan      html  css  js  c++  java
  • Linux组件封装之一:MUtexLock

    本文对pthread_mutex_t 进行简易的封装;

    互斥锁主要用于互斥,描述的是一种竞争关系,主要是一个 一种资源或者代码, 在一段时间内 至多能被一个程序访问。

    而条件变量主要用于线程间同步, 描述的是一种协作关系

    Linux中互斥锁的应用比较简单,通用的有以下几个函数:

    1 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
    2 int pthread_mutex_lock(pthread_mutex_t *mutex);
    3 int pthread_mutex_unlock(pthread_mutex_t *mutex);
    4 int pthread_mutex_destroy(pthread_mutex_t *mutex);

    说明:

    1、MutexLock、以及下篇文章中的Condition利用构造函数和析构函数自动完成资源的申请和释放;

    2、MutexLock、Condition和Thread 都涉及到系统资源,这些类 全部为不可复制的;例如,a程序启动了一把锁,而另外一个程序 b 复制了这把锁,若某一时刻,a程序把这把锁销毁了,这时无论如何,b程序都不可能拥有锁这个系统资源。因此,我们将其作为 NonCopyable 类 的私有继承。

    一、NonCopyable类:

     1 #ifndef NONCOPYABLE_H_
     2 #define NPNCOPYABLE_H_
     3 
     4 class NonCopyable //禁用值语义
     5 {
     6     public:
     7         NonCopyable(){ }
     8         ~NonCopyable(){ }
     9 
    10     private:
    11         NonCopyable(const NonCopyable &);//no copy
    12         void operator=(const NonCopyable &);//no assignment
    13 };
    14 
    15 #endif

    二、互斥锁类(MutexLock),代码如下:

     1 #ifndef MUTEX_LOCK_H
     2 #define MUTEX_LOCK_H
     3 #include "NonCopyable.h"
     4 #include "pthread.h"
     5 #include <assert.h>
     6         
     7 //attention
     8 class MutexLock:NonCopyable
     9 {
    10     public:
    11         MutexLock();
    12         ~MutexLock();
    13         
    14         void lock(); //上锁
    15         void unlock();//释放锁
    16         bool isLocking() const { return isLocked_;}//判断锁的状态
    17         pthread_mutex_t getMutex()
    18         { return mutex_; }
    19     private:
    20         pthread_mutex_t mutex_;
    21         bool isLocked_;//标记是否上锁
    22 };
    23 
    24 MutexLock::MutexLock()
    25     :isLocked_(false)
    26 {
    27     pthread_mutex_init(&mutex_, NULL);
    28 }
    29 MutexLock::~MutexLock()
    30 {
    31     //判断是否已经解锁
    32     assert(!isLocking());
    33     pthread_mutex_destroy(&mutex_);
    34 }
    35 void MutexLock::lock()
    36 {
    37     isLocked_ = true;
    38     pthread_mutex_lock(&mutex_);
    39 }
    40 void MutexLock::unlock()
    41 {
    42     isLocked_ = false;
    43     pthread_mutex_unlock(&mutex_);
    44 }
    45 
    46 #endif
  • 相关阅读:
    NOI2013 树的计数
    拆系数FFT学习笔记
    HAOI2017 八纵八横——线段树分治+线性基
    BJOI2018链上二次求和——线段树
    [bzoj3514]Codechef MARCH14 GERALD07加强版——lct+主席树
    KD-Tree 学习笔记
    SDOI2010 捉迷藏 —— KD-Tree
    HAOI2018染色——容斥
    gitignore 不起作用的解决办法
    reids学习教程
  • 原文地址:https://www.cnblogs.com/xfxu/p/4008654.html
Copyright © 2011-2022 走看看