在多线程编程中,往往会通过全局变量或类变量之类来进行线程间共享,以达到数据共享的便利性,但这也引入了共享资源被多个线程同时写时
引起的资源不同步的问题,这时就需要使用互斥锁pthread_mutex_t来解决这个问题。
1.pthread_mutex_t介绍
1.1互斥锁的创建
锁既可以动态创建也可以静态创建。
1)静态创建:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
互斥锁是pthread_mutex_t的结构,而PTHREAD_MUTEX_INITIALIZER是一个结构常量;
2)动态创建:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);参数attr指定了新建互斥锁的属性。若为NULL,则使
用默认的互斥锁属性,默认属性为快速互斥锁。互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试
图对一个已经被锁定的互斥锁加锁时表现不同。
1.2互斥锁属性
pthread_mutexattr_init(pthread_mutexattr_t *mattr)初始化互斥锁属性。然后可以调用其他的属性设置方法来设置其属性。
1.3互斥锁的使用
1)pthread_mutex_lock(pthread_mutex_t *mutex); // 加锁
2)pthread_mutex_trylock(pthread_mutex_t *mutex);// 尝试加锁,调用线程不会被挂起,返回EBUSY
3)pthread_mutex_unlock(pthread_mutex_t *mutex); // 释放锁
1.4销毁锁
pthread_mutex_destory(pthread_mutex_t *mutex);不再使用的锁需要进行锁资源释放,否则会造成内存泄漏。(ps:锁需要是没有锁上的,该函
数才会执行成功)
2.互斥锁使用注意事项
2.1何时加锁
多人读,不需要;一读一写要加;多人写要加。(对int/int63/char型是原子操作,可不加锁,但没人保证这一点,建议还是加)
2.2死锁
死锁一般发生在多锁(如线程1和线程2均依赖锁A、B,而各自线程1持有锁A,线程2持有锁B)或忘记释放锁时(如某一线程加了锁,却用goto或
return语句提前退出而没有释放锁),因些需要遵守以下原则:
1)操作共享资源前一定要获取锁,完成操作后一定要释放锁; 2)尽量短时间占有锁; 3)多锁时,按加锁顺序释放锁,如加锁ABC,释放也为ABC,而加锁时,各线程必须按照既定顺序加锁,如存在A、B锁时,所有线程均按照AB顺序或
BA顺序加锁; 4)线程错误提前返回时必须释放它所占有的锁。
参考:
http://blog.youkuaiyun.com/yasi_xi/article/details/19112077