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
阅读全文
0 0
- Linux多线程之互斥锁pthread_mutex_t
- Linux--16:Linux线程之互斥锁pthread_mutex_t
- 多线程互斥锁Pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Linux线程-互斥锁pthread_mutex_t
- Unity3d搭建与调用webservice方法
- 2017.08.14【NOIP 普及组】模拟赛C组总结
- 数据库学习纪要(三):hive-3
- 玩玩微信公众号Java版之七:自定义微信分享
- image-loader
- Linux多线程之互斥锁pthread_mutex_t
- POJ 1014 Dividing (多重背包问题+递归)【模板】
- 三种网络共享的方式
- 2017年多校联合训练 第六场(福州大学)
- CC_CALLBACK 与 std::bind之间不可告人的秘密
- spring mvc 基础
- 用Scala模拟Spark集群启动过程
- ubuntu下使用pycharm调用Hanlp自然语言处理包
- 集训第十五天(2017/8/14):单调队列&单调栈