一、线程同步
1.概念:线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回,同时其他线程为保证数据一致性,不能调用该功能。
2.作用:协同步调,防止数据混乱,产生与时间有关的错误
3.互斥锁(互斥量)
锁为建议锁,对公共数据进行保护,所以线程应该(有可能没有)在访问公共数据前,先拿锁再访问,但是,锁不具有强制性。
流程:
①pthread_mutex_t lock:创建锁
②pthread_mutex_init:初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
③pthread_mutex_lock:加锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
④访问共享数据
⑤pthread_mutex_unlock:解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
⑥pthread_mutex_destroy:销毁锁
int pthread_mutex_trylock(pthread_mutex_t *mutex);
restrict:关键字,限定指针变量变量,被该关键字限定的指针变量,所指向的内存操作必须由本指针完成
初始化互斥量:
①pthread_mutex_init(&mutex,NULL) 动态初始化
②pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER 静态初始化
4.注意事项
访问共享资源前加锁,访问后立即解锁
互斥锁:pthread_mutex_init()调用成功初始值为1
加锁:–操作,值为0 如果无锁,会阻塞
减锁:++操作,值为1 唤醒阻塞在锁上的线程
try锁:尝试加锁,成功:++操作,失败:返回错误号(EBUSY)
5.读写锁特性
读锁写锁并行堵塞,写把锁优先级高,写独占,读共享,锁只有一把
①pthread_rwlock_init():初始化
②pthread_rwlock_destroy()
③pthread_rwlock_rdlock()
④pthread_rwlock_wrlock()
⑤pthread_rwlock_tryrdlock()
⑥pthread_rwlock_trywrlock()
⑦pthread_rwlock_unlock()
pthread_rwlock_t类型用于定义一个读写锁变量
6.死锁
是使用锁不恰当导致的现象
①对一个锁反复lock
②两个线程各自持有一把锁,去请求另一把
7.条件变量
本身不是锁,但是也可以造成线程堵塞,通常与互斥锁配合使用,给多线程提供一个回合场所
主要函数
①pthread_cond_init()
②pthread_cond_destory()
③pthread_cond_wait()
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
i阻塞等待条件变量参1的满足
ii释放已掌握的互斥锁,相当于pthread_mutex_unlock(&mutux)
前两步为原子操作,不可分离
iii当被唤醒,次函数返回时,解除阻塞并重新申请获取互斥锁
④pthread_cond_timedwait()
上图,如果超过十分钟还在堵塞,则调用这个函数返回
⑤pthread_cond_signal()
⑥pthread_cond_broadcast()
以上函数成功返回0,失败返回错误号
pthread_cond_t类型,用于定义条件变量
初始化条件变量:
pthread_cond_t cond;
①pthread_cond_init(&cond,NULL)动态初始化
②pthread_cond_t cond=PTHREAD_COND_INITIALIZER静态初始化