同步机制
线程与进程支持的同步机制:pshared参数表示共享属性线程还是进程 线程:互斥锁,读写锁,文件锁,条件变量,自旋锁,信号量 进程:互斥锁,读写锁,文件锁,自旋锁,信号量 锁机制:互斥锁,读写锁,文件锁,条件变量,自旋锁,信号量
1.互斥锁:
四种互斥锁:参数type表示互斥锁的类型,总共有以下四种类型: 1.PTHREAD_MUTEX_NOMAL:标准互斥锁,第一次上锁成功,第二次上锁会失败并阻塞 2.PTHREAD_MUTEX_RECURSIVE:递归互斥锁,第一次上锁成功,第二次上锁还会成功,可理解为内部有一计数器,每加锁加1,解锁减1 3.PTHREAD_MUTEX_ERRORCHECK:检查互斥锁,第一次上锁会成功,第二次上锁出错返回错误信息,不会阻塞 4.PTHREAD_MUTEX_DEFAULT:默认互斥锁,第一次上锁会成功,第二次上锁会失败
2.读写锁:某个共享数据变量读多写少,查找的操作耗时很长,如果加锁会降低效率,所以提出读写锁,具有写独占,读共享,写锁优先级高的特性
int pthread_rwlock_rdlock(pthread_rwlock_t *);获取一个读出锁,如果对应的读写锁已由某个写入者持有,那就阻塞调用线程: int pthread_rwlock_wrlock(pthread_rwlock_t *);获取一个写入锁,如果对应的读写锁已由另一个写入者持有,或者已由一个或多个读出者持有,就阻塞: int pthread_rwlock_unlock(pthread_rwlock_t *);释放一个读出锁或写入锁: 下面两个函数尝试获取一个读出锁或写入锁,但是如果该锁不能马上取得,那就返回一个EBUSY错误,而不是把调用线程投入睡眠: int pthread_rwlock_tryrdlock(pthread_rwlock_t *); int pthread_rwlock_trywrlock(pthread_rwlock_t *);
3.文件锁:包括建议性锁和强制性锁:
建议性锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。内核和系统都不使用建议性锁,依靠程序员遵守这个规定。 强制性锁:是由内核执行的锁,文件被上锁进行写操作时,内核将阻止其他文件对其读写操作。其对性能影响很大,读写操作必须检查是否锁存在。 文件锁的函数:fcntl()和flock()
4.自旋锁:特殊的互斥锁,被加锁后其他线程想要再次加锁,此时该线程不阻塞睡眠而是陷入循环等待状态,减少睡眠唤醒的资源消耗,但一直占用CPU。
5.条件变量:互斥锁主要用于上锁,而条件变量用于等待。
静态方式:pthread_cond_t cond PTHREAD_COND_INITIALIZER 动态方式:int pthread_cond_init(&cond,NULL) 注销:int pthread_cond_destory(&cond) 条件等待:int pthread_cond_wait(&cond,&mutex) 计时等待:int pthread_cond_timewait(&cond,&mutex,time) 激发一个等待线程:pthread_cond_signal(&cond) 激发所有等待线程:pthread_cond_broadcast(&cond)
6.信号量:互斥锁只允许一个线程进入临界区,而信号量允许多个线程进入临界区
int sem_init(&sem,pshared,v) int sem_wait(&sem):以原子操作的方式将信号量的值减去1 int sem_post(&sem):以原子操作的方式将信号量的值加上1 int sem_destory(&sem)