互斥量
两个线程访问同一块共享资源,如果不协调顺序,容易造成数据混乱
加锁
mutex
pthread_mutex_init初始化
pthread_mutex_destroy摧毁
pthread_mutex_lock加锁
pthread_mutex_unlock(pthread_mutex_t*mutex)解锁
mutex互斥量
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
- restrict约束该块内存区域对应的数据,只能通过后面的变量进行访问和修改
- mutex互斥量---锁
- attr互斥量的属性,可以不考虑,传NULL
互斥量的使用:
- 初始化
- 加锁
- 执行逻辑---操作共享数据
- 解锁
注意事项:
加锁需要最小力度,不要一直占用临界区。
尝试加锁:
int pthread_mutex_trylock(pthread_mutex_t*mutex);
死锁
- 锁了又锁,自己加了一次锁,成功后又加了一次
- 交叉锁
互斥量只是建议锁
读写锁
读写锁的特点:读共享,写独占,写优先级高
读写锁仍然是一把锁,有不同的状态:
- 未加锁
- 读锁
- 写锁
读写锁的使用场景:适合读的线程多
初始化:
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock, const pthread_rwlockattr_t *restrict attr);
pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
销毁读写锁:
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_cond_timedwait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
条件变量阻塞等待:
int pthread_cond_wait(pthread_cond_t *restrict cond,
pthread_mutex_t *restrict mutex);
- 先释放锁mutex
- 阻塞在cond条件变量上
销毁一个条件变量
int pthread_cond_destroy(pthread_cond_t *cond);
初始化一个条件变量
int pthread_cond_init(pthread_cond_t *restrict cond,
const pthread_condattr_t *restrict attr);
唤醒至少一个阻塞在条件变量cond上的线程
int pthread_cond_signal(pthread_cond_t *cond);
唤醒阻塞在条件变量cond上的全部线程
int pthread_cond_broadcast(pthread_cond_t *cond);
信号量
信号量是进化版的互斥量,允许多个线程访问共享资源
int sem_init(sem_t *sem, int pshared, unsigned int value);
- sem定义的信号量,传出
- pshared
–0代表线程信号量
–非0代表进程信号量
sem_destroy摧毁信号量
int sem_destroy(sem_t *sem);
申请信号量,申请成功value–
int sem_wait(sem_t *sem);
- 当信号量为0时,阻塞
释放信号量value++
int sem_post(sem_t *sem);