linux 线程同步问题之互斥锁

线程的特点是一个轻量级的,所有的线程共享相同的资源,这样一来就产生了问题,多线程如何来同步的合理的使用这些资源呢?在linux中提供了三种形式的同步模式,互斥锁,信号量,互斥变量三种模型来解决该问题。下来就简单介绍这几种情况:

<1>互斥锁(mutex)

    利用互斥锁来进行线程的同步,让每个线程在某个时间只能让一个线程使用该资源,用完之后释放该资源,供给其他线程使用。如下所示:互斥锁的方法介绍:

   初始化互斥锁:

   int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

   mutex:该参数为pthread_mutex_t mutex变量,该变量的初始化有两种方式,一种是调用如上方法,另一种方式是静态初始化

   如下:

    pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER

   attr:该参数的取值如下:

 PTHREAD_MUTEX_TIMED_NP:其余线程等待队列

 PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争

 PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;

 PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争

   销毁互斥锁

   int pthread_mutex_destroy(pthread_mutex_t *mutex);

   加锁和解锁

     int pthread_mutex_lock(pthread_mutex_t *mutex);      //直接加锁

     int pthread_mutex_trylock(pthread_mutex_t *mutex);  //尝试加锁,但不一定成功

     int pthread_mutex_unlock(pthread_mutex_t *mutex);  //解锁 

    以上就是互斥锁的相关方法,如下为使用例子:

    class CLock{

    public:
        CLock(){
            pthread_mutex_init(&mutex_,NULL);
        }
        ~CLock(){
            pthread_mutex_destroy(&mutex_);
        }
        bool Lock(){
            pthread_mutex_lock(&mutex_);
        }
        bool unLock(){
            pthread_mutex_unlock(&mutex_);
        }
    protected:
        pthread_mutex_t mutex_;

};

//自动锁利用对象的创建和执行完调用析构完整自动加锁和解锁,在调用处
class AutoLock{

    public:
        AutoLock(CLock& m):auto_mutex_(m){auto_mutex_.Lock()}
        ~AutoLock(){auto_mutex_.unLock();}
    private:
        CLock& auto_mutex_; 

};

如上为封装的互斥锁和自动锁的过程。

   

  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值