多线程编程,互斥锁与自旋锁注意事项

多线程编程中会涉及公共资源相互竞争问题,就像火车上的厕所,只用一个人可以上,当有人进入后就会加锁。多线程一样为了避免多个线程同时访问公共资源也需要加锁。

一般会用到互斥锁或者自旋锁。

互斥锁线程请求锁,如果请求到加锁执行,然后解锁。如果没有请求到锁,那么就把线程放入等待队列里,将线程挂起。如果持有锁的线程执行完并且释放锁,则会唤醒等待队列里的某个线程去执行,那么它就能获取到锁。互斥锁会涉及线程挂起,导致线程的状态切换(用户态->内核态),这样会有上下文切换,这样性能会有损耗。

Linux内核提供了一系列互斥锁函数以供使用用法很简单:


       #include <pthread.h>


       pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;//互斥锁

       int pthread_mutex_init(pthread_mutex_t *restrict mutex,
              const pthread_mutexattr_t *restrict attr);//初始化锁


       int pthread_mutex_lock(pthread_mutex_t *mutex);//加锁 如果没有获取到锁,阻塞(线程挂起)直到获取到锁,加锁

       int pthread_mutex_trylock(pthread_mutex_t *mutex);//尝试加锁,如果获取到锁然后加锁返回0,没有获取到锁返回错误码

       int pthread_mutex_unlock(pthread_mutex_t *mutex);//释放指定的锁,这样其他线程可以获取到锁

       int pthread_mutex_destroy(pthread_mutex_t *mutex);//销毁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值