线程的特点是一个轻量级的,所有的线程共享相同的资源,这样一来就产生了问题,多线程如何来同步的合理的使用这些资源呢?在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_;
};
如上为封装的互斥锁和自动锁的过程。