线程是操作系统调度的最小单位,当多个线程需要共同操作同一共享资源时,需要同步状态避免引起共享资源竞争和不可预知的结果
-
条件变量 变量是线程间共享全局变量进行同步的一种机制,访问共享资源时先加锁,条件不满足时等待触发(先解锁后再挂起,不占用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);
|