Linux线程同步机制的几种方法总结与对比
2014-10-28 14:46
549 查看
线程同步机制的几种方法总结与对比
需要线程同步的原因:当有多个线程同时访问一个共享内存里面的变量时,有时会出现一个线程正在修改该变量的值,而其他的线程正在读取数据,可能就会导致错误。
实现线程同步机制的方法:
·互斥量
·读写锁
·条件变量
一. 互斥量
互斥量从本质上说就是一把锁,在访问共享资源时,对互斥量加锁,访问完成后释放锁。对互斥量加锁以后,其他任何试图对互斥量再次加锁的线程会被阻塞直至当前线程释放互斥锁。相关函数可参考 APUE 教材。
二. 避免死锁
如果某个线程试图对同一个互斥量加锁两次,那么它将进入死锁状态,这个是比较明显的死锁产生状态。还有一些更加不明显的方式也能产生死锁。比如:程序使用多个互斥量时,如果允许 线程甲 一直占有第一个互斥量 A 并且在试图锁住第二个互斥量 B 时处于阻塞状态,但是拥有第二个互斥量 B 的线程 乙 也在试图锁住第一个互斥量 A 。这时就会发生死锁。解决方法:可用过小心的控制互斥量加锁顺序来避免死锁。
运用数据结构解决。
三. 读写锁
读写锁和互斥量类似,区别在于:互斥量只有两个状态,即锁住状态和不加锁状态,而且一次只有一个线程可以对其加锁。而读写锁可以有三个状态,读模式下加锁状态,写模式下加锁状态,不加锁状态。一次只能有一个线程占有写模式的读写锁,但可以由多个线程同时占有读模式的读写锁。读写锁非常适用于对数据结构读次数远大于写的情况。
相关函数可参考 APUE 教材。
四. 条件变量
条件变量使我们可以睡眠等待某种条件出现。条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。
相关函数可参考 APUE 教材。
相关文章推荐
- Linux下线程同步的几种方法
- Linux进程通信总结(linux进程间通信的几种机制的比较及适用场合)
- 【大总结】几种安装linux操作系统的方法
- 【续】用ObjectDataSource实现自定义分页的心得总结,几种分页方法的性能对比
- linux下使用shell批量修改文件名几种方法总结
- Linux上查看用户创建日期的几种方法总结
- Linux几种进程间通信机制的对比
- Linux下线程同步的几种方法
- Linux下启动orcale数据库几种方法总结
- Android编程实现异步消息处理机制的几种方法总结
- 线程同步的几种方法的总结
- Linux主机之间传输文件的几种方法对比
- Linux下实现定时器Timer的几种方法总结
- Linux下线程同步的几种方法
- Linux主机之间传输文件的几种方法对比
- 几种常见DRL(深度强化学习)方法总结与对比之前提基本概念
- 线程同步的几种方法的总结
- Linux下线程同步的几种方法
- 线程同步的几种方法的总结