Linux多线程之互斥锁pthread_mutex_t

来源:互联网 发布:淘宝网造牙粉 编辑:程序博客网 时间:2024/06/06 15:43
    在多线程编程中,往往会通过全局变量或类变量之类来进行线程间共享,以达到数据共享的便利性,但这也引入了共享资源被多个线程同时写时
引起的资源不同步的问题,这时就需要使用互斥锁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.csdn.net/yasi_xi/article/details/19112077