1 互斥量
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);//初始化mutex变量,成功返回0
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);//对互斥量加锁,若已锁则阻塞
int pthread_mutex_trylock(pthread_mutex_t *mutex);//对互斥量加锁,若已锁则失败并返回EBUSY
int pthread_mutex_unlock(pthread_mutex_t *mutex);//对互斥量解锁
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct tiemspec *restrict tsptr);//带超时的互斥锁,避免永久阻塞
2 读写锁
3种状态:读模式下加锁状态,写模式下加锁状态,不加锁状态。
一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。
适用于读远大于写的情况。
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);//加读锁
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);//加写锁
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_timedrdlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict tsptr);//带超时的读锁
int pthread_rwlock_timedwrlock(pthread_rwlock_t *restrict rwlock, const struct timespec *restrict tsptr);//带超时的写锁
3 条件变量
传递给pthread_cond_wait的互斥量对条件进行保护。调用者把锁住的互斥量传给函数,函数然后自动把调用线程放到等待条件的线程列表上,对互斥量解锁。pthread_cond_wait返回时,互斥量再次被锁住。
条件的检测是在互斥锁的保护下进行的。如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步。
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, cosnt struct timespec *restrict tsptr);
int pthread_cond_signal(pthread_cond_t *cond);//至少唤醒一个等待该条件的线程
int pthread_cond_broadcast(pthread_cond_t *cond);//唤醒所有等待该条件的线程
4 自旋锁
自旋锁在获取锁之前一直处于忙等(自旋)阻塞状态。可用于以下情况:锁被持有的时间短,而且线程并不希望在重新调度上花费太多的成本。
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);//pshared参数表示进程共享属性,表明自旋锁是如何获取的。
//PTHREAD_PROCESS_SHARED:自旋锁能被可以访问锁底层内存的线程所获取
//PTHREAD_PROCESS_PRIVATE:自旋锁只能被初始化该锁的进程内部的线程所访问
int pthread_spin_destroy(pthread_spinlock_t *lock);
int pthread_spin_lock(pthread_spinlock_t *lock);
int pthread_spin_trylock(pthread_spinlock_t *lock);
int pthread_spin_unlock(pthread_spinlock_t *lock);
5 屏障
屏障是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,知道所有的合作线程都到达某一点,然后从该点继续执行。
int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned int count);//count参数指定在允许所有线程继续运行之前,必须到达屏障的线程数目
int pthread_barrier_destroy(pthread_barrier_t *barrier);
int pthread_barrier_wait(pthread_barrier_t *barrier);//表明线程已完成工作,准备等所有其他线程赶上来