lock总结

看完apue,总觉得不踏实,总结一下互斥量:

互斥量从本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后,任何试图再次对互斥量加锁的进程将会被阻塞直到拥有该互斥量的线程释放该互斥量。互斥量用数据类型pthread_mutex_t表示,初始化方法:1、用PTHREAD_MUTEX_INITIALIZER常量赋值2、调用函数pthread_mutex_init函数进行初始化。

int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);若成功返回0.
int pthread_mutex_destory(pthread_mutex *mutex),在释放内存前,需要调用destory

对互斥量进行锁处理的相关函数
int pthread_mutex_lock/pthread_mutex_trylock/pthread_mutex_unlock(pthread_mutex_t *mutex);
lock和trylock函数用来加锁;unlock用来解锁。

lock和trylock的区别是,lock的时候当互斥量已经加锁,再次调用lock的线程将被阻塞;而trylock不会被阻塞,返回EBUSY。


读写锁
顾名思义,读写锁一共有3种状态,读锁、写锁、不加锁。一次只能有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。写锁状态就如同对互斥量加锁一样。当处于读锁状态时,如果线程想加写锁,则必须等到所有的读锁全部释放,而且 发出写锁的请求之后会阻塞之后的读锁的请求
读写锁非常适合对数据结构读的次数远大于写的情况
int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,const pthread_rwlockattr_t *restrict attr)
int pthread_rwlock_destory(pthread_rwlock_t *rwlock)
init负责初始化,destory负责做清理工作
读、写、解锁
int pthread_rwlock_rdlock/pthread_rwlock_wrlock/pthread_rwlock_unlock(pthread_rwlock_t *rwlock)
同样,也定义了有条件的读写锁版本
int pthread_rwlock_tryrdlock/pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock)

条件变量
利用线程间共享的全局变量来进行同步。条件变量与互斥量是在一起使用,条件本身由互斥量保护,线程在改变条件状态前必须首先锁住互斥量。条件变量与互斥量一样都需要进行初始化:1、利用常量PTHREAD_COND_INITIALIZER付给静态的条件变量 2、使用pthread_cond_init函数初始化
int pthread_cond_init(pthread_cond_t *restrict cond,pthread_condattr_t *restrict attr);
int pthread_cond_destory(pthread_cond_t *cond)
若成功返回0,否则返回错误编号

使用pthread_cond_wait系列函数等待条件变为真,而且可以指定等待时间
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex)

int pthread_cond_timewait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict timeout)

函数中出现的互斥量对条件进行保护,调用者将 锁住的互斥量传给函数。函数 把调用线程放到等待条件的线程列表上,然后对互斥量进行解锁,当函数返回时,互斥量再次被锁住。
条件发生改变时,利用函数来唤醒线程
唤醒某个线程
int pthread_cond_signal(pthread_cond_t *cond)
唤醒所有等待的线程
int pthread_cond_broadcast(pthread_cond_t *cond)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值