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_; 

};

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

   

  

 

猜你喜欢

转载自blog.csdn.net/qq_26105397/article/details/79794450
今日推荐