线程同步的API

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);//表明线程已完成工作,准备等所有其他线程赶上来
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值