Linux 系统编程 -(pthread) 线程通信 (自旋锁)
1. 自旋锁介绍
自旋锁不管是内核编程,还是应用层编程都会用到;自旋锁和互斥量类似,它不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等(也就叫自旋)状态。
自旋锁可用于下面的情况:锁被持有的时间短,并且线程不希望再重新调度上花费太多的成本。自旋锁通常作为底层原语用于实现其他类型的锁。根据他们所基于的系统架构,可以通过使用测试并设置指令有效地实现。当然这里说的有效也还是会导致 CPU 资源的浪费:当线程自旋锁变为可用时,CPU 不能做其他任何事情,这也是自旋锁只能够被只有一小段时间的原因。
自旋锁总结:
自旋锁和互斥锁的使用框架、场景相似的。
互斥锁在得不到锁的时候会休眠。
自旋锁在得不到锁的时候不会休眠,会一直检测锁的状态。
自旋锁比较适合保护变量赋值、函数调用等场景。
2. 自旋锁相关接口函数
pthread_spin_init
函数的pshared
参数表示进程共享属性,表明自旋锁是如何获取的,如果它设为PTHREAD_PROCESS_SHARED
,则自旋锁能被,可以访问锁底层内存的线程所获取,即使那些线程属于不同的进程。否则pshared
参数设为PTHREAD_PROCESS_PRIVATE
,自旋锁就只能被初始化该锁的进程内部的线程访问到。
如果自旋锁当前在解锁状态,pthread_spin_lock
函数不要自旋就可以对它加锁,试图对没有加锁的自旋锁进行解锁,结果是未定义的。需要注意,不要在持有自旋锁情况下可能会进入休眠状态的函数,如果调用了这些函数,会浪费 CPU 资源,其他线程需要获取自旋锁需要等待的时间更长了。
3. 自旋锁运用模板
下面代码创建了两个线程,分别访问一个全局变量,这里采用自旋锁进行保护。
版权声明: 本文为 InfoQ 作者【DS小龙哥】的原创文章。
原文链接:【http://xie.infoq.cn/article/647dc49668ba49c05f3de11d3】。文章转载请联系作者。
评论