线程同步
互斥锁
*互斥锁通过锁机制来实现线程间的同步.在同一时刻它通常只允许一个线程执行一个关键部分的代码.
互斥锁函数
*使用互斥锁前,必须先进行初始化操作.初始化有两种方式:
>1.静态赋值法,将宏结构常量PTHREAD_MUTEX_INITIALIZER赋给互斥锁,操作语句为:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
>2.通过pthread_mutex_init函数初始化互斥锁,该函数原型为
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);
*函数中的参数mutexattr表示互斥锁的属性,如果为NULL则使用默认属性.
*初始化以后,就可以给互斥锁加锁.
加锁
>phread_mutex_lock()
函数原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
>pthread_mutex_trylock()
函数原型:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
*用phread_mutex_lock()加锁时,如果mutex已被锁住,当前尝试加锁的线程就会阻塞,直到互斥锁被其他线程释放.当phread_mutex_lock()函数返回时,说明互斥锁已经被当前线程成功加锁.
*pthread_mutex_trylock()函数加锁时,如果mutex已经被加锁,它将立即返回,返回的错误码是EBUSY,而不是阻塞等待.
*加锁时,不论哪种类型的锁,都不可能被两个不同的线程同时得到,其中一个必须等待解锁,在同一进程中的线程,如果加锁后没有解锁,则其他线程将无法再获得该锁.
解锁
pthread_mutex_unlock()
*函数原型:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
*用pthread_mutex_unlock()函数解锁时,要满足:
>1.互斥锁必须处于加锁状态
>2.调用本函数的线程必须是给互斥锁加锁的线程.
*解锁后如果有其他线程在等待互斥锁,等待队列中的第一个线程将获得互斥锁.
*当一个互斥锁使用完毕后,必须进行清除.
清除互斥锁
pthread_mutex_destroy()
*函数原型:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
*清除一个互斥锁要求当前处于开放状态,若锁处于锁定状态,函数返回EBUSY,该函数成功执行时返回0.
条件变量
*条件变量是利用线程间共享的全局变量进行同步的一种机制.条件变量宏观上类似if语句,符合条件就能执行某段程序,否则只能等待条件成立.
操作条件变量的函数
>条件变量的初始化
>1.静态赋值法:将宏结构常量PTHREAD_COND_INITIALIZER赋予互斥锁.操作语句如下:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
>2.使用函数pthread_cond_init函数原型为:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
等待条件成立
>1.pthread_cond_wait
*函数原型:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
>2.pthread_cond_timedwait
*函数原型:
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
激活等待线程
>1.pthread_cond_signal
*函数原型:
int pthread_cond_signal(pthread_cond_t *cond);
>2.pthread_cond_broadcast
*函数原型:
int pthread_cond_broadcast(pthread_cond_t *cond);
*区别:
pthread_cond_signal()激活一个等待条件成立的过程,存在多个等待线程时,按入队顺序激活其中一个,而pthread_cond_broadcast()则激活所有等待进程.
清除条件变量
*pthread_cond_destroy()
*函数原型:
int pthread_cond_destory(pthread_cond_t *cond);
*注意:
pthread_cond_destroy函数清除由cond指向的条件变量.只有在没有线程等待该条件变量的时候才能清除这个条件变量,否则返回EBUSY.