线程是操作系统调度的最小单位,当多个线程需要共同操作同一共享资源时,需要同步状态避免引起共享资源竞争和不可预知的结果
-
条件变量
变量是线程间共享全局变量进行同步的一种机制,访问共享资源时先加锁,条件不满足时等待触发(先解锁后再挂起,不占用CPU),等待其他线程激活后再加锁使用共享资源
初始化条件变量:
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);
循环和计时等待:
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);
激活单个和所有线程:
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
销毁条件变量:
int pthread_cond_destroy(pthread_cond_t *cond); -
互斥锁
互斥锁是同一时刻只允许一个线程执行锁中的代码
初始化锁:
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
阻塞和非阻塞加锁:
int pthread_mutex_lock(pthread_mutex *mutex);
int pthread_mutex_trylock( pthread_mutex_t *mutex);
解锁:
int pthread_mutex_unlock(pthread_mutex *mutex);
销毁锁:
int pthread_mutex_destroy(pthread_mutex *mutex); -
自旋锁
自旋锁类似互斥锁,区别为在锁被其他线程持有时会持续的获取锁状态
优点:一直处于用户态,不进行睡眠和线程上下文切换,执行效率高(互斥锁涉及内核调度线程上下文切换)
缺点:循环时间长的话过度消耗cpu资源,影响其他线程的cpu资源使用
特点:在内核中,被自旋锁保护的代码执行中不能睡眠,单核处理器下会死锁,多核中两个线程在同一处理器下也可能死锁,所以现在的处理器都会设置自旋时间上限防止死锁,另外自旋锁在单核非抢占式cpu是无效的,在单核抢占式cpu禁止内核抢占并不实现自旋,在多核可抢占cpu为禁止内核抢占且可自旋
初始化和销毁锁:
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); -
读写锁
读写锁是同一时刻只允许多个读者或者一个写者执行锁中的代码
初始化:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
加解锁:
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);
销毁锁:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); -
信号量
线程间和进程间一样,也可以使用信号量进行信息同步
初始化:
int sem_init (sem_t *sem , int pshared, unsigned int value);
增加信号量值,v操作
int sem_post(sem_t *sem);
减少信号量值,p操作
int sem_wait(sem_t *sem);
销毁信号量:
int sem_destroy(sem_t *sem); -
线程间通信方式比较