互斥锁和条件变量
2016-07-05 08:31
246 查看
互斥琐
定义:指代相互排斥,最基本的同步形式。用于保护临界区,以保证任何时刻只有一个线程或一个进程在执行其中的代码。
上锁:pthread_mutex_lock()
临界区
解锁:pthread_mutex_unlock();
条件变量
定义:用于等待信号,同步的另一种手段。每一个条件变量总有一个互斥琐与之关联。
等待函数:pthread_cond_wait();
信号发送函数:pthread_cond_signal();
生产者和消费者的问题:生产者向buf添加数据,添加到 m 个,消费者读数据,读到 i 个;
1.如果只用互斥琐解决,消费者读的每一个i 数据,都必须先上锁 m ,然后查询 i < m ? 然后解锁,如果不小于,则接着上锁——查询——解锁,需要轮询,这将非常消耗CPU。
2.互斥琐+条件变量完美解决这个问题:互斥琐用于上锁,条件变量用于等待,生产者流程 上锁——生产数据——解锁,上锁——改变条件,发信号——解锁。(条件用来通知消费者数据准备好,为避免上锁冲突,需要先改变条件再发信号)。消费者流程 上锁——等待条件,改变条件——解锁。
附加:
读写锁:
同步一些线程共享的一个或多个数据的访问或更新。
属性:只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。
仅当没有线程持有某个给定的读写锁用于读或写时,才能分配该读写锁用于写。
相关函数:pthread_rwlock_rdlock();//获取一个读出锁;
pthread_rwlock_wrlock();//获取一个写入锁;
pthread_rwlock_unlock();//释放一个读出锁或写入锁;
记录上锁:读写锁的一种扩展类型,可用于有亲缘关系或无亲缘关系的进程之间共享某个文件的读和写。被锁住的文件通过其描述符访问,执行上锁操作的函数是fcntl.这种锁通常在内核中维护,属主是由属主的进程ID标识的。
定义:指代相互排斥,最基本的同步形式。用于保护临界区,以保证任何时刻只有一个线程或一个进程在执行其中的代码。
上锁:pthread_mutex_lock()
临界区
解锁:pthread_mutex_unlock();
条件变量
定义:用于等待信号,同步的另一种手段。每一个条件变量总有一个互斥琐与之关联。
等待函数:pthread_cond_wait();
信号发送函数:pthread_cond_signal();
生产者和消费者的问题:生产者向buf添加数据,添加到 m 个,消费者读数据,读到 i 个;
1.如果只用互斥琐解决,消费者读的每一个i 数据,都必须先上锁 m ,然后查询 i < m ? 然后解锁,如果不小于,则接着上锁——查询——解锁,需要轮询,这将非常消耗CPU。
2.互斥琐+条件变量完美解决这个问题:互斥琐用于上锁,条件变量用于等待,生产者流程 上锁——生产数据——解锁,上锁——改变条件,发信号——解锁。(条件用来通知消费者数据准备好,为避免上锁冲突,需要先改变条件再发信号)。消费者流程 上锁——等待条件,改变条件——解锁。
附加:
读写锁:
同步一些线程共享的一个或多个数据的访问或更新。
属性:只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。
仅当没有线程持有某个给定的读写锁用于读或写时,才能分配该读写锁用于写。
相关函数:pthread_rwlock_rdlock();//获取一个读出锁;
pthread_rwlock_wrlock();//获取一个写入锁;
pthread_rwlock_unlock();//释放一个读出锁或写入锁;
记录上锁:读写锁的一种扩展类型,可用于有亲缘关系或无亲缘关系的进程之间共享某个文件的读和写。被锁住的文件通过其描述符访问,执行上锁操作的函数是fcntl.这种锁通常在内核中维护,属主是由属主的进程ID标识的。
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍