《UNIX环境高级编程》(APUE) 笔记第十一章 - 线程 (4)

自旋锁 与互斥量类似,但它不是通过休眠使进程阻塞,而是在获取锁之前一直处于 忙等 (自旋) 阻塞状态(不占用CPU)。当线程自旋等待锁变为可用时,CPU不能做其他事情,这是为什么自旋锁只能够被持有一小段时间的原因。

自旋锁 可用于:锁持有时间短,而且线程并不希望在重新调度上花费太多的成本。自旋锁通常作为底层原语用于实现其他类型的锁。

pthread_spinlock_t 表示自旋锁,初始化和反初始化函数为:

#include<pthread.h> int pthread_spin_init(pthread_spinlock_t *lock, int pshared); int pthread_spin_destroy(pthread_spinlock_t *lock); //返回值:若成功,返回0;否则,返回错误编号

可以用 pthread_spin_lockpthread_spin_trylock 函数对自旋锁进行加锁,前者在获取锁之前一直自旋,后者如果不能获取锁,就立即返回 EBUSY 错误。调用 pthread_spin_unlock 函数解锁:

#include <pthread.h> int pthread_spin_lock(pthread_spinlock_t *lock); int pthread_spin_trylock(pthread_spinlock_t *lock); int pthread_spin_unlock(pthread_spinlock_t *lock); //返回值:若成功,返回0;否则,返回错误编号 13. 屏障

屏障 (barrier) 是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,知道所有的合作线程都达到某一点,然后从该点继续执行。

初始化和反初始化

#include <pthread.h> int pthread_barrier_init(pthread_barrier *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned int count); int pthread_barrier_destroy(pthread_barrier *barrier); //返回值:若成功,返回0;否则,返回错误编号

\(count\) 参数指定在允许所有线程继续运行之前,必须到达屏障的线程数目。

使用 pthread_barreir_wait 函数来表明,线程已完成工作,准备等所有其他线程赶上来:

#include <pthread.h> int pthread_barrier_wait(pthread_barrier_t *barrier); //返回值:若成功,返回 0 或者 PTHREAD_BARRIER_SERIAL_THREAD;否则,返回错误编号

调用 pthread_barrier_wait 的线程在屏障计数未满足条件时,会进入休眠状态。若该线程是最后一个调用该函数的线程,就满足了屏障计数,所有线程都被唤醒。

14. 五个基本同步机制

互斥量

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjgyx.html