1、带超时的互斥量
//等待的时间是绝对时间
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);
2、读写锁
写加锁只有一个线程可以,读加锁所有线程都可以(读加锁后在想写加锁不可以)。
//初始化
静态分配定义PTHREAD_RWLOCK_INITIALIZER
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_tryrdlock(pthread_rwlock_t *rwlock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
3、条件变量
条件变量自身由互斥量保护的,等待条件满足
静态条件定义=PTHREAD_COND_INITIALIZER
//动态
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_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict tsptr);
//通知条件已经满足,唤醒线程
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_boardcast(pthread_cond_t *cond);
4、自旋锁
不是通过休眠使进程阻塞,而是在获取锁之前一直处于忙等。用于锁被持有的时间短,而且线程并不希望在重新调度上花费太多成本。
//若pshared=PTHREAD_PROCESS_SHARED则自旋锁可以访问不同进程的线程
int pthread_spin_init(pthread_spinlock_t *lock, int pshared);
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、屏障
允许每个线程等待,直到所有的合作线程都达到了某一点,然后从该店继续执行。
//count指定线程等待的个数
int pthread_barrier_init(pthread_barrier_t *restrict barrier, const pthread_barrierattr_t *restrict attr, unsigned int count);
int pthread_barrier_destroy(pthread_barrier_t *barrier);
//如果最后一个线程调用该函数,则所有线程被唤醒
int pthread_barrier_wait(pthread_barrier_t *barrier);