Linux多线程之互斥锁pthread_mutex_t

本文深入探讨了Linux环境下多线程编程中的互斥锁机制,详细解析了pthread_mutex_t类型及其使用方法,帮助读者理解如何在多线程中实现资源的互斥访问,确保程序的正确性和并发安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    在多线程编程中,往往会通过全局变量或类变量之类来进行线程间共享,以达到数据共享的便利性,但这也引入了共享资源被多个线程同时写时
引起的资源不同步的问题,这时就需要使用互斥锁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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值