线程同步
1、同步:同时起步,协调一致
2、线程同步:同步即协同步调,按预定的先后次序运行
指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其他线程为保证数据一致性,不能调用该功能。
3、互斥量(互斥锁)
pthread_mutex_t 只有0和1两个值
主要应用函数:
pthread_mutex_init:初始化一把互斥锁(初值可看作1)
pthread_mutex_destory
pthread_mutex_lock:会阻塞到锁被释放可以拿到
pthread_mutex_trylock:尝试一下就返回
pthread_mutex_unlock
在访问共享资源前加锁,访问后应立即解锁。锁的粒度应越小越好
4、死锁
1)线程试图对同一互斥量A加锁两次
2)线程1拥有A锁,请求获得B锁;线程2拥有B锁,请求获得A锁
5、读写锁:写独占、读共享,写锁优先级高
一把锁具有三种状态:
1、读模式下加锁状态(读锁)
2、写模式下加锁状态(写锁)
3、不加锁状态
主要应用函数:pthread_rwlock_t
pthread_rwlock_init
pthread_rwlock_destory
pthread_rwlock_rdlock
pthread_rwlock_wrlock
pthread_rwlock_tryrdlock
pthread_rwlock_trywrlock
pthread_rwlock_unlock
6、条件变量:条件变量本身不是锁!但他可以造成线程阻塞,通常与互斥锁配合使用,给多线程提供一个会和的场所
主要应用函数:
pthread_cond_init
phread_cond_destory
pthread_cond_wait:
1)阻塞等待一个条件变量满足(参1)满足
2)释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex) 1、2两步为一个原子操作
3)当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁
pthread_mutex_lock(&mutex)
pthread_cond_timedwait:阻塞等待条件变量绝对时间:相对于1970年1月1日过去了多久-UMIX计时元年
!!正确用法:time_t cur=time(NULL);
struct timespec t;
t.tv_sec=cur+1;//定时一秒
pthread_cond_timedwait(&cond,&mutex,&t);
pthread_cond_signal:唤醒至少一个该条件变量阻塞函数
pthread_cond_broadcast:唤醒所有该条件变量阻塞函数
7、生产者消费者模型
8、信号量:线程/进程同步都可以用(和信号完全不一样):信号量的初值决定了占用信号线程的个数
进阶版互斥锁(1---->N)
主要应用函数:
sem_init
sem_destory
sem_wait :信号量大于0,则信号量--;信号量等于0,则造成线程堵塞(类似pthread_mutex_lock)
sem_trywait
sem_timedwait
sem_post:将信号量++,同时唤醒阻塞在信号量上的线程(类似pthread_mutex_unlock)
9、进程间同步
互斥量mutex:在pyhread_mutex_init初始化之前修改其属性为进程间共享,mutex属性修改函数主要有:
pthread_mutexattr_t mattr类型,用于定义属性
1)pthread_mutexattr_init
2) pthread_mutexattr_destory
3) pthread_mutexattr_setpshared
10、fcntl()和位图
借助fcntl()函数实现文件锁:fcntl(fd,F_SETLKW,&flock);
F_SETLK(try_lock)
F_SETLKW(lock wait) 加减锁都是他 通过参数 stuck flock
F_GETLK
多线程无法使用文件锁!!!
哲学家吃面问题